当我使用不正确的凭据登录时出现错误
问题描述:
因此,当我输入正确的用户名/密码时,登录工作正常。然而,当我输入了不正确的用户名或密码,它返回此错误:当我使用不正确的凭据登录时出现错误
AttributeError: AnonymousUser' object has no attribute '_meta'
这里是我的代码:
views.py
def boxes_view(request):
...
form = UserRegistrationForm(request.POST or None)
form_login = UserLoginForm(request.POST or None)
if request.user.is_authenticated():
print('LOGGED IN')
context = {
'form': form,
'form_login': form_login
}
return render(request, 'polls.html', context)
def register(request):
form = UserRegistrationForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
email = form.cleaned_data['email']
user = User.objects.create_user(username=username, password=password, email=email)
user.save()
user = authenticate(username=username, password=password, email=email)
login(request, user)
return redirect('/')
else:
print(form.errors)
print(form.non_field_errors)
form = UserRegistrationForm()
return redirect('/')
def user_login(request):
form_login = UserLoginForm(request.POST or None)
if form_login.is_valid():
username = form_login.cleaned_data['username']
password = form_login.cleaned_data['password']
user = authenticate(username=username, password=password)
login(request, user)
return redirect('/')
else:
print(form_login.errors)
print(form_login.non_field_errors)
form_login = UserLoginForm()
return redirect('/')
def user_logout(request):
logout(request)
return redirect('/')
forms.py
class UserLoginForm(forms.Form):
username = forms.CharField(max_length=25)
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = [
'username',
'password',
]
class UserRegistrationForm(forms.Form):
email = forms.EmailField()
username = forms.CharField(max_length=25)
password = forms.CharField(widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = [
'username',
'email',
'password',
'confirm_password',
]
def clean(self):
email = self.cleaned_data.get('email')
current_emails = User.objects.filter(email=email)
if current_emails.exists():
raise forms.ValidationError("That email is taken")
urls.py
BV = views.boxes_view
urlpatterns = [
url(r'^$', BV, name='news'),
url(r'^user_login/', views.user_login, name='user_login'),
url(r'^user_logout/', views.user_logout, name='user_logout'),
url(r'^register/', views.register, name='register'),
]
base.html文件 polls.html
<form method="post" enctype="multipart/form-data" action="{% url 'user_login' %}">{% csrf_token %}
<div class="loginWrapper">
{{ form_login.username|placeholder:"username" }}
{{ form_login.password|placeholder:"password" }}
<input type="submit" value="login" style="margin-left: 10px"/>
</div>
</form>
<form method="post" enctype="multipart/form-data" action="{% url 'register' %}">{% csrf_token %}
<div class="registerWrapper">
{{ form.username|placeholder:"username" }}
{{ form.email|placeholder:"email" }}
{{ form.password|placeholder:"password" }}
{{ form.confirm_password|placeholder:"confirm password" }}
<input type="submit" value="register" />
</div>
</form>
任何想法,我怎么能解决这个问题的家长吗?
回溯:
File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
39. response = get_response(request)
File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/zorgan/Desktop/app/draft1/draft1/views.py" in user_login
108. login(request, user)
File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/contrib/auth/__init__.py" in login
124. request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/utils/functional.py" in inner
235. return func(self._wrapped, *args)
Exception Type: AttributeError at /user_login/
Exception Value: 'AnonymousUser' object has no attribute '_meta'
答
你在这里做了不少奇怪的事情。但眼前的问题是,你不检查验证是否真正成功。
user = authenticate(username=username, password=password)
if user:
login(request, user)
else:
# show an error
+0
是的,这似乎是问题,谢谢。你还看到了什么其他“奇怪的东西”?我这样格式化视图的原因是因为我在主页上有登录和注册表单(可通过javascript onclick访问,以防止页面刷新)。所以登录/注册表单没有自己的URL。 – Zorgan
+0
主要是,如果验证失败,您不会返回带有errorsb的表单,但会在本地打印错误,然后创建一个新的空表单。 –
总是显示有问题的完整的错误信息(追溯) - 不仅是最后一行。可以有其他有用的信息。 – furas
在我的编辑中添加。 – Zorgan