我正在try 创建一个auth后端,以允许我的用户使用他们的邮箱地址或他们在Django 1.6中的用户名使用自定义用户模型进行登录.当我使用用户名登录,但由于某种原因不能使用邮箱登录时,后端可以正常工作.我是不是忘了做什么事?

from django.conf import settings
from django.contrib.auth.models import User

class EmailOrUsernameModelBackend(object):
    """
    This is a ModelBacked that allows authentication with either a username or an email address.

    """
    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
            kwargs = {'username': username}
        try:
            user = User.objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, username):
        try:
            return User.objects.get(pk=username)
        except User.DoesNotExist:
            return None

编辑:按照建议,我已从ModelBackend继承并将其安装在我的设置中 我的设置里有这个 身份验证_后端=( ‘users.backends’, ‘django.contri.auth.backends.ModelBackend’, ) 我已经将后端更改为以下内容:

from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.backends import ModelBackend
class EmailOrUsernameModelBackend(ModelBackend):
    """
    This is a ModelBacked that allows authentication with either a username or an email address.

    """
    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
            kwargs = {'username': username}
        try:
            user = User.objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, username):
        try:
            return User.objects.get(pk=username)
        except User.DoesNotExist:
            return None

现在我得到一个Module "users" does not define a "backends" attribute/class错误.

推荐答案

在遵循上面给我的建议并更改AUTHENTICATION_BACKENDS = ['yourapp.yourfile.EmailOrUsernameModelBackend']后,我得到了错误Manager isn't available; User has been swapped for 'users.User'.这是因为我使用的是默认用户模型,而不是我自己的自定义模型.这是工作代码.

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

class EmailOrUsernameModelBackend(ModelBackend):
    """
    This is a ModelBacked that allows authentication
    with either a username or an email address.
    
    """
    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
            kwargs = {'username': username}
        try:
            user = get_user_model().objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, username):
        try:
            return get_user_model().objects.get(pk=username)
        except get_user_model().DoesNotExist:
            return None

Django相关问答推荐

为什么当对字段使用自定义序列化器时,Django Rest框架中Inbox字段会消失?

DRF中是否有有效的更新有序数据的算法?

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

Django-Values()并按月分组

如何在Django REST框架中使用FactoryBoy创建不同的项目

__init__()获取了意外的关键字参数';id';

在Python中向函数的查询列表添加条件

获取 Django (postgres) 中带注释字段的平均值

使用django提交后如何保留html表单数据?

django - 让用户登录到测试客户端

Django Blob 模型字段

如何访问 Django Rest Framework 上的自定义 HTTP 请求标头?

Django:通过manage.py使用服务器和gunicorn等其他服务器之间的区别.哪个更好?

Django 从字段开始

如何迭代模板中 SelectField 的选项?

Django ModelChoiceField optgroup 标签

模型表格Save保存,Get获取保存的对象

如何在 django 中仅获取表的特定列?

找不到 msguniq.确保您安装了 GNU gettext 工具 0.15 或更新版本. (Django 1.8 和 OSX ElCapitan)

在 django 中获取空查询集的类名