0

我正在使用 django 并具有电子邮件验证功能,因此当有人验证电子邮件时,我会通过设置状态来激活他/她的帐户。如果有人将其他人的电子邮件地址发送给其他人,那么他将无法验证并且无法使用该电子邮件地址登录。所以我期待 django 在登录时查看用户的状态,因为这个状态字段在 django auth 应用程序的表中。在登录时,django 尝试仅使用用户名参数登录。所以登录时它说:

MultipleObjectsReturned at /accounts/login/
 get() returned more than one User -- it returned 2! Lookup parameters were {'username': u'kaasib122@gmail.com'}

有没有办法在查找中添加状态字段?是否有一些配置,或者我需要为此编写某种登录后端?或者我应该以某种不同的方式为登录表编写自己的视图?推荐的方式是什么?另外我正在考虑让用户在用户名字段中使用电子邮件或用户名登录。那么推荐的方式是什么?

4

1 回答 1

1

您需要编写一个适合您需求的身份验证后端。查看django 文档

基本上,您将需要编写一个“身份验证”方法,该方法将在过滤器参数中使用“状态”。对于使用电子邮件或用户名,您基本上可以过滤一个字段(用户名或电子邮件),如果没有为该字段返回用户对象,则过滤另一个。或者,您可以通过对这些字段进行 ORing 来让用户进入单个过滤器。这是一个伪代码:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class AuthenticationBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(email=username, status=True)
        except User.DoesNotExist:
            try:
                user = User.objects.get(username=username, status=True)
            except User.DoesNotExist:
                return None
        # check password too
        if user.check_password(password):
            return user
        return None

请注意,当您编写新的身份验证后端时,您需要将其添加到 settings.py 中的 AUTHENTICATION_BACKENDS 参数才能使用。如果您不需要 Django 提供的默认值,因为您已经自定义了它,只需覆盖该参数,无需添加到元组中。

于 2012-09-20T06:42:51.260 回答