Django-使用电子邮件登录

我希望django通过电子邮件而非用户名对用户进行身份验证。一种方法是提供电子邮件值作为用户名值,但我不希望那样。原因是,我有一个url /profile/<username>/,所以我不能有一个url /profile/abcd@gmail.com/。


另一个原因是所有电子邮件都是唯一的,但有时用户名已被使用。因此,我将自动创建用户名为fullName_ID。


我该如何更改才能让Django通过电子邮件进行身份验证?


这就是我创建用户的方式。


username = `abcd28`

user_email = `abcd@gmail.com`

user = User.objects.create_user(username, user_email, user_pass)

这就是我的登录方式。


email = request.POST['email']

password = request.POST['password']

username = User.objects.get(email=email.lower()).username

user = authenticate(username=username, password=password)

login(request, user)

除了先获取用户名外,登录还有其他方法吗?


慕码人2483693
浏览 1045回答 3
3回答

倚天杖

您应该编写一个自定义身份验证后端。这样的事情会起作用:from django.contrib.auth import get_user_modelfrom django.contrib.auth.backends import ModelBackendclass EmailBackend(ModelBackend):&nbsp; &nbsp; def authenticate(self, username=None, password=None, **kwargs):&nbsp; &nbsp; &nbsp; &nbsp; UserModel = get_user_model()&nbsp; &nbsp; &nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user = UserModel.objects.get(email=username)&nbsp; &nbsp; &nbsp; &nbsp; except UserModel.DoesNotExist:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return None&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if user.check_password(password):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return user&nbsp; &nbsp; &nbsp; &nbsp; return None然后,在您的设置中将该后端设置为您的auth后端:AUTHENTICATION_BACKENDS = ['path.to.auth.module.EmailBackend']已更新。继承自ModelBackend它get_user()已经实现的方法。
打开App,查看更多内容
随时随地看视频慕课网APP