В Django и DRF, почему api route request.user возвращает экземпляр AnonymousUser, а django.contrib.auth.get_user(request) возвращает пользователя?

Давайте рассмотрим очень простой маршрут:

class Highscore(APIView):
    def get(request):
        user = request.user
        highscore = user.highscore
        return Response({"highschore":highscore}) 

По неизвестной причине бывают случаи, когда request.user несмотря на то, что пользователь аутентифицирован и вошел в систему (!) возвращается экземпляр Anonymous User, а не сам пользователь.

Однако это можно обойти, используя get_user функцию util из django.contrib.auth.

from django.contrib.auth import get_user

class Highscore(APIView):
    def get(request):
        user = get_user(request)
        highscore = user.highscore
        return Response({"highschore":highscore}) 

Что может быть причиной этого?

Важное замечание: пользователь точно вошел в систему. Настолько, что при открытии сайта администратора в другой вкладке, он распознает правильного пользователя просто по сессии. Если это администратор, то он показывает содержимое администратора, а если нет, то выдает "Вы вошли как ..., но этот вид зарезервирован для пользователей администратора".

Я думаю, что вам не хватает добавления атрибута класса authentication_classes в класс представления,

from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import SessionAuthentication


class Highscore(APIView):
    permission_classes = [IsAuthenticated]
    authentication_classes = [SessionAuthentication]

    def get(self, request):
        user = request.user
        highscore = user.highscore
        return Response({"highschore": highscore})
Вернуться на верх