Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django authenticate()对于自定义模型始终返回None_Python_Django - Fatal编程技术网

Python Django authenticate()对于自定义模型始终返回None

Python Django authenticate()对于自定义模型始终返回None,python,django,Python,Django,我是django的新手,我必须用它做一个后端。 我的问题:我有多个模型(客户端、驱动程序、公司),所有模型都应该登录和验证(每个模型都在不同的应用程序上,但它们都扩展了相同的用户模型),我见过这么多这样的问题,但没有一个解决了我的问题,即验证(username='username',password='password')始终不返回。 用户记录存在于数据库中,我用过滤器(username=(username))检查了它。 下面是一些代码: UserManager类: class UserMana

我是django的新手,我必须用它做一个后端。 我的问题:我有多个模型(客户端、驱动程序、公司),所有模型都应该登录和验证(每个模型都在不同的应用程序上,但它们都扩展了相同的用户模型),我见过这么多这样的问题,但没有一个解决了我的问题,即验证(username='username',password='password')始终不返回。 用户记录存在于数据库中,我用过滤器(username=(username))检查了它。 下面是一些代码:

UserManager类:

class UserManager(BaseUserManager):

def create_user(self, username, password, phone):
    if not username:
        raise ValueError("user must provide a username")
    if not password:
        raise ValueError("user must provide a password")
    if not phone:
        raise ValueError("user must povide a phone number")

    user_obj = self.model(
        user_name=username,
        phone=phone
    )
    user_obj.set_password(password)
    user_obj.save()
    return user_obj
用户类:

class User(AbstractBaseUser):
    user_name = models.CharField(max_length=32, unique=True)
    email = models.EmailField(max_length=255, unique=True, null=True)
    phone = PhoneNumberField()
    access_token = models.CharField(max_length=255, unique=True, null=True)
    notifications_token = models.CharField(max_length=255, unique=True, null=True)
    photo = models.ImageField()
    person_in_contact = models.CharField(max_length=32)
    active = models.BooleanField(default=False)
    confirmedEmail = models.BooleanField(default=False)
    confirmedPhone = models.BooleanField(default=False)
    completedProfile = models.BooleanField(default=False)

    objects = UserManager()

    @property
    def is_active(self):
        return self.active

    def __str__(self):
        return "Client : " + self.user_name + " Email:" + self.email

    def get_email(self):
        return self.email

    USERNAME_FIELD = 'user_name'

    REQUIRED_FIELDS = ['username', 'phone', 'password']

    class Meta:
        abstract = True
Person类(客户端和驱动程序由此扩展):

下面是我正在测试的驱动程序模型(如果成功,我将对其他两个模型应用相同的方法):

已设置my settings.py文件夹:

AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)

AUTH_USER_MODEL = 'drivers.Driver'
下面是我如何在python控制台中进行测试:

>>> from django.contrib.auth import authenticate
>>> print (authenticate(username='Simouchee',password='123456789'))
None
当我使用过滤器进行测试并存在时:

>>> driver = Driver.objects.filter(user_name = 'Simouchee')
>>> driver.exists()
True
欢迎提供有关如何正确验证自定义模型的任何帮助/提示。
真的很抱歉,我觉得有必要详细解释这条长长的线索。

您在这里有一个错误
身份验证(username='Simouchee',password='123456789')

您的模型中有
user\u name
,但
authenticate
调用中有
username

我想说的是,最好在模型中使用不带下划线的
username
,方式与django框架本身相同-

同时检查此处提到的密码-


编辑:问题可以在
用户
模型中。对于字段
活动
,您有
默认值=False
,因此还要检查您的用户是否活动。由于
模型后端
在方法
中检查
是否活动
用户可以进行身份验证
-

如果检索实例,则检查
驱动程序。检查密码('123456789')
return
True
?在运行“身份验证”之前,您如何在控制台中创建驱动程序?@schwobaseggl yes它确实返回True。@Hanny我不是在控制台中创建驱动程序,驱动程序已经在数据库中,我只是尝试对其进行身份验证。为什么不创建一个测试(自动测试)-然后创建用户并在测试中查找/诊断问题,而不是使用数据库中可能发生变化的数据?然后您可以创建用户并尝试进行身份验证,以确保100%与数据无关,这可能会导致一些问题?这是一种更安全的方法,自动化并确保您全程负责流程-还有,它可以在将来为其他用户复制,可以在任何地方进行测试,并允许您对代码进行测试,以便将来进行更改,这样您就知道它不会中断。默认的
modelbend
将传递给
authenticate
的标准
用户名
kwarg转换为
用户名\u字段上的查询(请参阅)。所以下划线应该不是问题。@Schwobasegl是对的,我按照你说的做了,但仍然是同一个问题。@Schwobasegl,这是真的,我的错。由于你的链接,我还有另外一个猜测。@wassimchaguetmi,请检查你的用户是否处于活动状态。对于字段
活动
你有
默认值=False
,天哪,你真了不起,我没用!我想我必须自己检查是否激活,我不知道django会自动为我做这件事。我所要做的就是让用户在数据库中无条件地激活,并正确验证并返回用户。非常感谢你,编辑你的答案,这样我就可以接受它,这样其他人就可以从中受益。
>>> from django.contrib.auth import authenticate
>>> print (authenticate(username='Simouchee',password='123456789'))
None
>>> driver = Driver.objects.filter(user_name = 'Simouchee')
>>> driver.exists()
True