Django authenticate всегда возвращает None независимо от того, что - PullRequest
0 голосов
/ 18 февраля 2020

Я пытался добавить функциональность регистрации / входа / выхода. Регистрация пользователя работает нормально, поскольку созданный пользователь появляется в Django admin и появляется в базе данных. Однако всякий раз, когда я пытаюсь реализовать функцию входа в систему, она никогда не работает. Я думаю, что сузил проблему до authenticate().

Я перепробовал все, и что бы я ни делал, функция authenticate() всегда возвращает None. Имена пользователей и пароли, которые я даю, явно сохраняются, и, тем не менее, похоже, что пароль не получается правильно, так как распечатка raw_password = form.cleaned_data.get('password1') в представлении login_user дает None.

Как можно У меня работает логин?

В urls.py

urlpatterns = [
    path('register', views.register_user, name='register'),
    path('login', views.login_user, name='login'),
    path('logout', views.logout_user, name='logout'),
]

В views.py

def register_user(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)

        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            print(f'User is: {user}')
            login(request, user)
            return redirect('/')

    else:
        form = UserCreationForm(request.POST)

    context = {
        'form': form
    }
    return render(request, 'register.html', context)

def login_user(request):
    if request.method == 'POST':
        form = AuthenticationForm(request=request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            print(f'User is: {user}')
            print(f'username is: {username}')
            print(f'password is: {raw_password}')
            if user is not None:
                if user.is_active:
                    login(request, user)
                    print(f'You are now logged in as {username}')
                    messages.info(request, f"You are now logged in as {username}")
                    return redirect('/')
    else:
        form = AuthenticationForm()

    return render(request = request,
                    template_name = "login.html",
                    context={"form":form})

def logout_user(request):
    logout(request)
    return redirect('/')

В регистр. html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Registration</title>
</head>
<body>
    <h2>Register</h2>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Register</button>
    </form>
</body>
</html>

В логин. html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Log in</title>
</head>
<body>
    <h2>Log in</h2>
    <form method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Log in</button>
    </form>
</body>
</html>

register_user и logout_user Представления работают нормально. В представлении register_user я сделал так, чтобы он автоматически регистрировал пользователя после регистрации. Как ни странно, вход в систему работает в этом сценарии. Однако вход в систему не работает для представления login_user по причинам, указанным выше.

1 Ответ

0 голосов
/ 19 февраля 2020

raw_password = form.cleaned_data.get('password1') здесь вы должны получить password, а не password1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...