Почему данный код не логинит пользователя?

Есть такой код:
@api_view(['POST'])
def login(request):
    if request.method == 'POST':
        data = json.loads(request.body.decode('utf-8'))
        username = data.get('username', None)
        password = data.get('password', None)
        if username is not None and password is not None:
            user = authenticate(username=username, password=password) #функция из джанги, которая ка бы отрабатывает, но при этом, если я буду логиниться как админ и зайду в админку, то меня попросят залогиниться заново

            if user is not None:
                if user.is_active:
                    token, created = Token.objects.get_or_create(user=user)
                    return JsonResponse({
                        'token': token.key,
                        'username': user.username
                    })
                else:
                    return JsonResponse({
                        'error': 'Invalid User'
                    }, status=status.HTTP_401_UNAUTHORIZED)
            else:
                return JsonResponse({
                    'error': 'Invalid Username/Password'
                }, status=status.HTTP_401_UNAUTHORIZED)
        else:
            return JsonResponse({
                'error': 'Invalid Data'
            }, status=400)
    elif request.method == 'OPTIONS':
        return JsonResponse({})
    else:
        return JsonResponse({
            'error': 'Invalid Method'
        }, status=405)

user = authenticate(username=username, password=password)
#функция из джанги, которая ка бы отрабатывает(переменной user присвоится то что надо), но при этом, если я буду логиниться как админ и зайду в админку, то меня попросят залогиниться занов.
Ещё не совсем понимаю как работать с токеном, который DRF отдает, неужели при каждой проверке прав нужно лезть в базу и сверять токен, зачем он тогда вообще нужен? В доке по дрф 1 абзац про то как токен получить, и всё. Если расскажите что и как, то буду признателен.
  • Вопрос задан
  • 264 просмотра
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Всё правильно, authenticate() проверяет пару логин пароль и в случае успеха возвращает соответствующий экземпляр модели User. И всё, сессионный cookie она клиенту не устанавливает, каждый новый запрос будет анонимным.

Если клиента нужно идентифицировать между запросами, используйте login().

P.S. Только или импортируйте её под другим именем, или переименуйте свою вьюху.
Ответ написан
Комментировать
zelsky
@zelsky
Я так делал.
def login_view(request):
  6         email = request.POST.get('email', '')
  7         password = request.POST.get('password','')                                                                                                                   
  8         user = authenticate(email=email, password=password)
  9 
 10         if user is not None:
 11             login(request, user)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы