我希望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)

除了先拿到用户名之外,还有其他的登录方式吗?

推荐答案

您应该编写一个自定义身份验证后端.像这样的方法会奏效:

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

然后,在您的设置中将该后端设置为您的身份验证后端:

AUTHENTICATION_BACKENDS = ['path.to.auth.module.EmailBackend']

Updated.从ModelBackend继承,因为它已经实现了像get_user()这样的方法.

请参阅此处的文档:https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#writing-an-authentication-backend

Django相关问答推荐

Django的update_or_create失败,尽管指定了kwargs'

Django www.example.com从常量列表中删除值

Django中的判断约束

获取PyCharm中继承方法的未解析属性引用

如何访问 django 模板中的字典值?

如果字段为空,则 Unique_together 不起作用.怎么约束呢?

如何在不编写每个视图中的逻辑的情况下呈现值,Django?

如何在 Django 模板视图中显示我的数据?

Django 如何知道我的数据库的路径?

为什么我的搜索功能返回错误相关字段查找无效:​​类别

相同的字符串不同的翻译

Django 模板中的 Handlebars.js

Django ModelChoiceField optgroup 标签

Django ALLOWED_HOSTS IP 范围

Django 和 VirtualEnv 开发/部署最佳实践

django admin 排序外键字段列表

django 模板列表变量中的最后一个元素

如何将 django csrf 令牌直接嵌入 HTML?

Django/Python初学者:执行python manage.py syncdb时出错-找不到psycopg2

django 如何知道已经运行了哪些迁移?