使用不正确的凭据登录时出错

时间:2016-12-24 11:17:21

标签: python django django-forms django-views

因此,当我输入正确的用户名/密码时,登录工作正常。但是,当我输入错误的用户名或密码时,它会返回以下错误:

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'

1 个答案:

答案 0 :(得分:0)

你在这里做了很多奇怪的事情。但直接的问题是你不能检查验证是否真的成功。

user = authenticate(username=username, password=password)
if user:
    login(request, user)
else:
    # show an error