Я пытался добавить функциональность регистрации / входа / выхода. Регистрация пользователя работает нормально, поскольку созданный пользователь появляется в 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
по причинам, указанным выше.