authenticate всегда возвращает None
from django.contrib.auth import authenticate, login
from django.shortcuts import redirect
from django.http import HttpResponse
def auth_check(request):
try:
username = request.POST['username']
password = request.POST['password']
if all([username, password]):
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
else:
return HttpResponse('Неверный логин или пароль!')
except (KeyError, AttributeError):
pass
return redirect('/')
Если я активирую функцию с помощью shell, то authenticate работает корректно и возвращает объект пользователя, а если через сайт, то всегда возвращает None. (Делал дебаг, вывел в файл лога то, что ввёл и там всё правильно (username и password), но authenticate возвратил None). Как решить проблему?
Ответы (1 шт):
Так как информации недостаточно для того чтобы понять в чем проблема. Я предложу вариант как лучше переписать ваш метод и приэтом добавлю те вещи которые мне кажется могли бы указать на проблему.
def auth_check(request):
username = request.POST.get('username')
password = request.POST.get('password')
if not (username and password):
return HttpResponseBadRequest('Некорректный запрос username и password обязательные поля')
log.debug(f'database url: {settings.DATABASES}')
log.debug(f'auth backend: {settings.AUTHENTICATION_BACKENDS}')
user = authenticate(username=username, password=password)
if user is None:
return HttpResponseForbidden('Неверный логин или пароль!')
login(request, user)
return redirect('/')
@receiver(user_logged_in)
def user_logged_in_callback(sender, request, user, **kwargs):
log.debug(f'login user_id={user.id} with username: {user.username}')
@receiver(user_login_failed)
def user_login_failed_callback(sender, credentials, **kwargs):
log.debug(f'login failed for: {credentials}')
Еще на всякий случай бы уточнил какой бэкенд отрабатывает при вызове функции AUTHENTICATION_BACKENDS. Добавьте то что получится при выводе в обоих случаях в описание вопроса, чтобы наверняка исключить некоторые глупые варианта, а не просто вам на слово верить. Так как вряд ли баг в джанге. Кстати какая у вас версия? И где хостится база?
PS. для логов лучше завести фековый аккаунт который после удалить сразу, чувствительные вещи можно потереть звездочками