В 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})