#python #django-2.0
#python #django-2.0
Вопрос:
У меня есть пользовательский сервер аутентификации, который регистрирует пользователя, используя либо имя пользователя, либо адрес электронной почты. Но он продолжает выдавать несколько ошибок:
auth_backend.py:
class EmailOrUsernameModelBackend(ModelBackend):
"""
This is a ModelBacked that allows authentication with either a username or an email address.
"""
def authenticate(self, username=None, password=None):
if '@' in username:
kwargs = {'email': username}
else:
kwargs = {'username': username}
try:
user = Farmer.objects.get(**kwargs)
if user.check_password(password):
return user
except Farmer.DoesNotExist:
return None
def get_user(self, username):
try:
return Farmer.objects.get(pk=username)
except Farmer.DoesNotExist:
return None
authenticate = EmailOrUsernameModelBackend.authenticate
views.py:
from .auth_backend import authenticate
def user_login(request):
if request.method == 'POST':
email = request.POST.get('email')
password = request.POST.get('password')
user = authenticate(username=email, password=password)
if user is_active:
login(request, user)
return redirect('stories')
else:
return HttpResponse("Invalid login details given")
else:
return render(request, 'stories/login.html', {})
Я продолжаю получать либо self is missing
, либо Invalid login details given
даже при использовании правильных учетных данных.
Комментарии:
1.В
authenticate
вы передаете адрес электронной почтыreturn Farmer.objects.get(email=email, password=password)
, однако вuser_login
вы передаете имя пользователяuser = authenticate(username=email, password=password)
. Это опечатка?2. Спасибо. Это опечатка. Я внес изменения в файл.
3. Похоже, что ваша аутентификация, вероятно, работает нормально, но пользователь неактивен (
is_active = False
). Если аутентификация завершается неудачей, то она возвращаетсяNone
, и в этом случае вы получите исключение дляif user.is_active
.4. Спасибо, но с моей стороны пользователь активен…
5. О, я удалил
user.check_password(user.password)
из auth_backend, и это работает. Спасибо всем.