django - 即使数据库中的用户名和密码正确,身份验证也始终不返回 - DJANGO
问题描述
在此之前,我想说我已经看到了许多解决方案,但仍然无法正常工作,这就是我问这个问题的原因
所以我尝试制作一个登录表单和一个登录模块,当我正确插入用户名和密码时->我已经从数据库中复制了该值,因此它将相同 100% --->但身份验证始终不返回
我已经将值打印到 cmd 中,我输入的值与数据库中的值相同。
这是 login.html
<div id="login-page">
<div class="container">
<form class="form-login" method="post">
{% csrf_token %}
<h2 class="form-login-heading">sign in now</h2>
<div class="login-wrap">
<input type="text" name="username" class="form-control" placeholder="User ID">
<br>
<input type="password" name="password" class="form-control" placeholder="Password">
<br>
{% if messages %}
<ul class="messages">
{% for message in messages %}
<font color="red"><li {% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li></font>
{% endfor %}
</ul>
{% endif %}
<button class="btn btn-theme btn-block" type="submit" href=""><i class="fa fa-lock"></i> SIGN IN</button>
<hr>
</form>
</div>
</div>
这是登录的视图(我已经修改了登录)并注册
def login_view(request):
if request.method == 'POST':
print("yes")
username = request.POST.get('username')
password = request.POST.get('password')
print(username)
print(password)
guest = User.objects.get(username=username)
rolee= UserProfileInfo.objects.get(user_id = guest.id).role
print(rolee)
user = authenticate(username=username, password=password)
print(user)
if user:
if rolee == 'Business Analyst':
login(request, user)
return redirect('/home/')
elif rolee == 'Admin':
login(request, user)
return redirect('/manageuser/')
elif rolee == 'Manager':
login(request, user)
return redirect('/approvallist/')
elif rolee == 'Segment Manager':
login(request, user)
return redirect('/approvallist/')
else:
messages.error(request, "Invalid username or password!")
form = AuthenticationForm()
return render(request,"login.html",{"form":form})
def register(request):
registered = False
if request.method == 'POST':
user_form = UserForm(data=request.POST)
profile_form = UserProfileInfoForm(data=request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save(commit=False)
clearPassNoHash = user_form.cleaned_data['password']
varhash = make_password(clearPassNoHash,None,'md5')
user.set_password(varhash)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
registered = True
else:
print(user_form.errors,profile_form.errors)
else:
user_form = UserForm()
profile_form = UserProfileInfoForm()
return render(request,'register.html',
{'user_form':user_form,
'profile_form':profile_form,
'registered':registered})
模型.py
class UserProfileInfo(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
role = models.CharField(max_length=250, blank=True)
description = models.TextField(max_length=250, blank=True)
address = models.CharField(max_length=250, blank=True)
phone = models.CharField(max_length=250, blank=True)
cell = models.CharField(max_length=250, blank=True)
def __str__(self):
return self.user.username
最后一个是:forms.py
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
class Meta():
model = User
fields = ('username','email','password')
class UserProfileInfoForm(forms.ModelForm):
class Meta():
model = UserProfileInfo
fields = ('role','description','address','phone','cell')
在我修改之前登录
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
guest = User.objects.get(username=username)
role = guest.role
user = authenticate(username=username, password=password)
if user is not None:
if role == 'Business Analyst':
login(request, user)
return redirect('/home/')
elif role == 'Admin':
login(request, user)
return redirect('/manageuser/')
elif role == 'Manager':
login(request, user)
return redirect('/approvallist/')
elif role == 'Segment Manager':
login(request, user)
return redirect('/approvallist/')
else:
messages.error(request, "Invalid username or password!")
else:
messages.error(request, "Invalid username or password!")
form = AuthenticationForm()
return render(request,"login.html",{"form":form})
笔记 :
首先我已经使用了 form.is_valid() -> 但它一直返回无效所以我删除了 form.is_valid() 所以我可以直接进行身份验证,但它总是说没有
在我散列密码之前,我的注册密码没有散列,并且我搜索身份验证需要散列密码,所以我尝试使用 django.contrib.auth.backend.md5hashers 或 settings.py 中的其他内容进行散列,并且已经散列,并且它仍然无法正常工作。
3.角色在不同的模型中
我希望有人可以修复它,已经尝试了很多方法并且无法完成..谢谢您的帮助<3
解决方案
我发现了这个问题,在您的注册过程中,您正在使用:
user = user_form.save(commit=False)
clearPassNoHash = user_form.cleaned_data['password']
varhash = make_password(clearPassNoHash,None,'md5')
user.set_password(varhash)
user.save()
实际上,set_password
将调用make_password
自身,所以你应该这样做:
user = user_form.save(commit=False)
clearPassNoHash = user_form.cleaned_data['password']
user.set_password(clearPassNoHash)
user.save()
这是如何
set_password
定义的:def set_password(self, raw_password): self.password = make_password(raw_password) self._password = raw_password ```
推荐阅读
- opengl-es-2.0 - 以恒定的屏幕宽度渲染线条艺术
- amazon-web-services - boto3 v1.9.244 是否支持创建“s3”资源?
- r - 从大列表中提取不同长度的字符行到数据框中?
- c++ - kbreakout 错误 qt.qpa.xcb:无法连接到显示器:0
- python - 在排序的单词列表中查找反转 - python
- angular - 将一个组件插入另一个父组件并传递数据
- jenkins - Jenkins Job DSL 配置块
- specflow - SpecFlow 在后面生成两个不同的代码,一个不起作用
- r - 如何修复多面 geom_col 图表看起来像原始图表?
- android - Dart:如何调用二维列表?