当前位置: 首页 > 知识库问答 >
问题:

Django-使用电子邮件登录

姜泰宁
2023-03-14

我希望django通过电子邮件而不是用户名来验证用户。一种方法是提供电子邮件值作为用户名值,但我不希望这样。原因是,我有一个url/profile/

另一个原因是所有电子邮件都是唯一的,但有时用户名已经被使用了。因此,我将自动创建用户名为fullName\u 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)

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


共有3个答案

程英资
2023-03-14

Django 3.x的电子邮件身份验证

为了使用电子邮件/用户名和密码进行身份验证,而不是默认的用户名和密码身份验证,我们需要重写ModelBackend类的两种方法:验证()和get_user():

get_user方法获取一个user_id–可以是用户名、数据库id或其他,但必须对用户对象唯一–并返回一个user对象或无。如果您没有将电子邮件保留为唯一密钥,则必须处理查询集返回的多个结果。在下面的代码中,已通过从返回的列表返回第一个用户来处理此问题。

from django.contrib.auth.backends import ModelBackend, UserModel
from django.db.models import Q

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try: #to allow authentication through phone number or any other field, modify the below statement
            user = UserModel.objects.get(Q(username__iexact=username) | Q(email__iexact=username))
        except UserModel.DoesNotExist:
            UserModel().set_password(password)
        except MultipleObjectsReturned:
            return User.objects.filter(email=username).order_by('id').first()
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

    def get_user(self, user_id):
        try:
            user = UserModel.objects.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

        return user if self.user_can_authenticate(user) else None

默认情况下,身份验证\u后端设置为:

['django.contrib.auth.backends.ModelBackend']

在settings.py文件中,在底部添加以下内容以替代默认设置:

AUTHENTICATION_BACKENDS = ('appname.filename.EmailBackend',)
裴昕
2023-03-14

如果你要开始一个新项目,django强烈建议你建立一个自定义用户模型。(见https://docs.djangoproject.com/en/dev/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project)

如果您这样做了,请在您的用户模型中添加三行:

class MyUser(AbstractUser):
    USERNAME_FIELD = 'email'
    email = models.EmailField(_('email address'), unique=True) # changes email to unique and blank to false
    REQUIRED_FIELDS = [] # removes email from REQUIRED_FIELDS

然后authenticate(电子邮件=电子邮件,密码=密码)工作,而authenticate(用户名=用户名,密码=密码)停止工作。

陆海阳
2023-03-14

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

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']

更新。继承自modelbend,因为它已经实现了get\u user()等方法。

在这里查看文档:https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#writing-an-authentication-backend

 类似资料:
  • 问题内容: 我希望django通过电子邮件而非用户名对用户进行身份验证。一种方法是提供电子邮件值作为用户名值,但我不希望这样。原因是,我有一个,所以我不能有一个。 另一个原因是所有电子邮件都是唯一的,但有时用户名已被使用。因此,我将自动创建用户名为。 我该如何更改才能让Django通过电子邮件进行身份验证? 这就是我创建用户的方式。 这就是我的登录方式。 除了先获取用户名外,登录还有其他方法吗?

  • 在“登录苹果”上,如果用户选择了“隐藏我的电子邮件”,他将注册一个私人电子邮件ID。同样,如果同一个用户尝试使用原始电子邮件地址(使用任何社交媒体帐户或原始电子邮件id)注册,他将被视为不同的用户? 如何可能确保我们在注册后数据库中有一个唯一的用户?

  • 实现django 2登录和注册的最佳方式是什么instagram.com.用户可以用用户名和电子邮件或电话和密码注册。注册后,用户可以用电子邮件地址、电话号码或用户名登录。 谢谢

  • 我已经实现了登录用户名或电子邮件在我现有的项目和工程罚款。我想将其扩展为使用用户名、电子邮件或电话登录。我想要一个用户登录用户名,电子邮件或电话号码和密码。 这是我的代码App\Http\Controllers\Auth\LoginController 应用程序\Http\控制器\Auth\注册控制器 注册工作正常,我可以将用户电话存储到用户表中。我已将电子邮件的输入类型更改为views/auth

  • 问题内容: 但是我已经尝试了一天多了,以获取与Django一起使用的电子邮件。 我收到此错误消息:当我尝试发送电子邮件时 这是我创建电子邮件并尝试在其视图中发送的地方: 我的设置文件如下: 我尝试过使用进行测试发送python -m smtpd -n -c DebuggingServer localhost:1025并获得了成功,但是当最终归结为真正却没有成功时。 当我尝试从外壳执行send_ma

  • 问题内容: 我想使用Django模板发送HTML电子邮件: 我找不到任何有关的信息,而django-mailer仅发送HTML模板,而没有动态数据。 如何使用Django的模板引擎生成电子邮件? 问题答案: 从docs,要发送HTML电子邮件,你想使用其他内容类型,如下所示: 你可能需要两个用于电子邮件的模板-一个看起来像这样的纯文本模板,存储在你的模板目录下: 还有一个HTMLy,存放在以下位置