Django: authenticate() returns none 除了一种情况
Django: authenticate() returns none except one case
所以我在我的项目中卡住了。我正在尝试创建用户,并且按照文档中推荐的方法使用 OneToOnefield 方法扩展了用户模型以创建用户配置文件。创建用户没有问题,因为所有详细信息都正确存储在 auth_user 和 appname_userprofile table.
中
我遇到的问题是当我尝试使用 auth_user table 中存储的任何用户登录时。除了一种情况(我在创建 userProfile 模型之前创建的)。所以在我的 auth_user Table 中,这个案例的通行证是编码的,但对于其余案例,它是纯文本。
这是我处理视图的函数 -
def login_view(request):
if request.method == 'POST':
print(request.body)
username = request.POST.get('id_username')
password = request.POST.get('id_password')
print(username, password)
try:
import pdb; pdb.set_trace()
user = authenticate(username=username, password=password)
print('This is ',user)
if user is not None:
login(request,user)
else:
return redirect('fileupload')
print('This is ',user).... some more code
现在,当我通过这个案例的凭据并尝试进行身份验证时。登录有效(除了我的代码在稍后的某个时候卡住了,因为这个用户没有任何个人资料)。
当我为创建 UserProfile 模型后创建的用户传递凭据时。
authenticate(username=username, password=password)
函数returns
None
我已将此添加到我的 settings.py -
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
这是我的模型 -
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
contact_no = models.CharField(max_length=10, null=True)
# email = models.EmailField()
department = models.CharField(max_length=25, null=True)
status = models.IntegerField(null=True)
industry_segment = models.CharField(max_length=50, null=True)
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.IntegerField(null=True)
updated_at = models.DateTimeField(auto_now=True)
updated_by = models.IntegerField(null=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
这就是我拯救用户的方式-
def user_view(request):
print(request.user)
if request.is_ajax():
print(request.user)
data = json.load(request)
u_name = data['txtfirstName'] + " " + data['txtlastName']
user=User(username=u_name,password='test123',email=data['txtemailId'])
user.save()
# userprofile= UserProfile.objects.create(user=request.user)
user.userprofile.contact_no = data['txtcontactNo']
# user.userprofile.email = data['txtemailId']
user.userprofile.department = data['txtdeptvalue']
user.userprofile.status = data['txtstatusvalue']
user.userprofile.industry_segment = 'Software'
user.userprofile.created_at = datetime.datetime.now()
user.userprofile.created_by = request.user.id
user.userprofile.updated_at = datetime.datetime.now()
user.userprofile.updated_by = request.user.id
user.save()
忽略此代码的格式...但它正在工作
谁能帮我解决身份验证问题?
您不能那样创建用户。密码不会被散列,因此在身份验证中永远不会匹配。您必须始终使用 create_user
管理器方法。
user = User.objects.create_user(username=u_name, password='test123', email=data['txtemailId'])
所以我在我的项目中卡住了。我正在尝试创建用户,并且按照文档中推荐的方法使用 OneToOnefield 方法扩展了用户模型以创建用户配置文件。创建用户没有问题,因为所有详细信息都正确存储在 auth_user 和 appname_userprofile table.
中我遇到的问题是当我尝试使用 auth_user table 中存储的任何用户登录时。除了一种情况(我在创建 userProfile 模型之前创建的)。所以在我的 auth_user Table 中,这个案例的通行证是编码的,但对于其余案例,它是纯文本。
这是我处理视图的函数 -
def login_view(request):
if request.method == 'POST':
print(request.body)
username = request.POST.get('id_username')
password = request.POST.get('id_password')
print(username, password)
try:
import pdb; pdb.set_trace()
user = authenticate(username=username, password=password)
print('This is ',user)
if user is not None:
login(request,user)
else:
return redirect('fileupload')
print('This is ',user).... some more code
现在,当我通过这个案例的凭据并尝试进行身份验证时。登录有效(除了我的代码在稍后的某个时候卡住了,因为这个用户没有任何个人资料)。
当我为创建 UserProfile 模型后创建的用户传递凭据时。
authenticate(username=username, password=password)
函数returns
None
我已将此添加到我的 settings.py -
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
这是我的模型 -
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
contact_no = models.CharField(max_length=10, null=True)
# email = models.EmailField()
department = models.CharField(max_length=25, null=True)
status = models.IntegerField(null=True)
industry_segment = models.CharField(max_length=50, null=True)
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.IntegerField(null=True)
updated_at = models.DateTimeField(auto_now=True)
updated_by = models.IntegerField(null=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
这就是我拯救用户的方式-
def user_view(request):
print(request.user)
if request.is_ajax():
print(request.user)
data = json.load(request)
u_name = data['txtfirstName'] + " " + data['txtlastName']
user=User(username=u_name,password='test123',email=data['txtemailId'])
user.save()
# userprofile= UserProfile.objects.create(user=request.user)
user.userprofile.contact_no = data['txtcontactNo']
# user.userprofile.email = data['txtemailId']
user.userprofile.department = data['txtdeptvalue']
user.userprofile.status = data['txtstatusvalue']
user.userprofile.industry_segment = 'Software'
user.userprofile.created_at = datetime.datetime.now()
user.userprofile.created_by = request.user.id
user.userprofile.updated_at = datetime.datetime.now()
user.userprofile.updated_by = request.user.id
user.save()
忽略此代码的格式...但它正在工作
谁能帮我解决身份验证问题?
您不能那样创建用户。密码不会被散列,因此在身份验证中永远不会匹配。您必须始终使用 create_user
管理器方法。
user = User.objects.create_user(username=u_name, password='test123', email=data['txtemailId'])