Показать статистику
0 голосов
от (2.7тыс. баллов)

Почему в Django и DRF маршрут API 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}) 

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

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

627 просмотров 1 ответов

1 Ответ

0 голосов
от (26.4тыс. баллов)

Я думаю, вам не хватает добавления  атрибута класса 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})
...