Пользователь не аутентифицирован в Django? Он показывает ошибки
Я создаю сайт и я закончил страницу регистрации на странице входа, все данные верны, но показывается Please verify your details I mean the else part also I put in print statement after username and password same details are printing when I typed but not access login.
views.py
def sign_in(request):
if request.method == "POST":
username=request.POST['username']
password=request.POST['password']
print(username,password)
user = authenticate(username=username,password=password)
if user is not None:
login(request,user)
messages.success(request,"you are logged successfully ")
return redirect("front_page")
else:
messages.error(request,"please verify your details")
return redirect("sign_in")
return render(request,"login.html")
def front_page(request):
return render(request,"frontpage.html")
urls.py
path('log_in',views.sign_in,name="sign_in"),
path('front_page',views.front_page,name="front_page"),
html
<div class="signup-form">
<form action="{% url 'sign_in' %}" method="POST">
{% csrf_token %}
<h2 class="text-center">Login</h2>
<p class="text-center">Please fill in this form to login your account!</p>
<hr>
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
<span class="fa fa-user"></span>
</span>
</div>
<input type="text" class="form-control" name="username" placeholder="Username" required="required">
</div>
</div>
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
<i class="fa fa-lock"></i>
</span>
</div>
<input type="password" class="form-control" name="password" placeholder="Password" required="required">
</div>
</div>
<div class="form-group d-flex justify-content-center">
<button type="submit" class="btn btn-primary btn-lg">Login</button>
</div>
<div class="text-center text-primary">Dont have a account? <a href="{% url 'register' %}">Create here </a></div>
</form>
</div>
Я просто хочу войти в систему с именем пользователя и паролем, но он показывает, пожалуйста, проверьте ваши данные, но все данные верны.
Есть идеи?
authenticate()
также требует request
в качестве аргумента, поэтому должно быть:
user = authenticate(request,username=username,password=password)
Редактирование:
Если пароль не хэширован, как предлагает @raphael в комментарии ниже, попробуйте хэшировать его с помощью make_password()
так:
from django.contrib.auth.hashers import make_password
def sign_in(request):
if request.method == "POST":
username=request.POST['username']
password=make_password(request.POST['password'])
print(username,password)
user = authenticate(username=username,password=password)
if user is not None:
login(request,user)
messages.success(request,"you are logged successfully ")
return redirect("front_page")
else:
messages.error(request,"please verify your details")
return redirect("sign_in")
return render(request,"login.html")
Проблема с вашим первоначальным кодом,
def sign_in(request):
if request.method == "POST":
username=request.POST['username']
password=request.POST['password']
print(username,password)
user = authenticate(username=username, password=password)
if user is not None:
login(request,user)
messages.success(request,"you are logged successfully ")
return redirect("front_page")
else:
messages.error(request,"please verify your details")
return redirect("sign_in")
return render(request,"login.html")
заключается в том, что вы пытаетесь аутентифицировать пользователя, который еще не зарегистрировался. Это похоже на код, который я нашел в docs, но этот код предназначен для логинизации пользователей, а не для их регистрации.
Решением является следующее:
def sign_in(request):
if request.method == "POST":
username=request.POST['username']
password=request.POST['password']
user, created = User.objects.get_or_create(username=username, password=password)
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect("front_page")
return render(request,"login.html")
Спасибо Sunderam за указание на мою ошибку, функция authenticate() действительно хэширует пароль, поэтому она принимает необработанный пароль.