Python Django authenticate()对于自定义模型始终返回None
我是django的新手,我必须用它做一个后端。 我的问题:我有多个模型(客户端、驱动程序、公司),所有模型都应该登录和验证(每个模型都在不同的应用程序上,但它们都扩展了相同的用户模型),我见过这么多这样的问题,但没有一个解决了我的问题,即验证(username='username',password='password')始终不返回。 用户记录存在于数据库中,我用过滤器(username=(username))检查了它。 下面是一些代码: UserManager类:Python Django authenticate()对于自定义模型始终返回None,python,django,Python,Django,我是django的新手,我必须用它做一个后端。 我的问题:我有多个模型(客户端、驱动程序、公司),所有模型都应该登录和验证(每个模型都在不同的应用程序上,但它们都扩展了相同的用户模型),我见过这么多这样的问题,但没有一个解决了我的问题,即验证(username='username',password='password')始终不返回。 用户记录存在于数据库中,我用过滤器(username=(username))检查了它。 下面是一些代码: UserManager类: class UserMana
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')
returnTrue
?在运行“身份验证”之前,您如何在控制台中创建驱动程序?@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