Тест Django user_passes_test всегда получает анонимного пользователя

Я использую следующее представление на основе класса и применяю к нему UserPassesTestMixin для проверки некоторых предварительных условий.

class SomeTestView(UserPassesTestMixin, APIView):

    def test_func(self):
        return check_precondition(self.request.user)

    def get(self, request):
        print("inside view")
        print("user: ", request.user)
        print("is_authenticated? ", request.user.is_authenticated)
        return Response({"status": "success"})

Ниже приведены мои предпосылки:

def check_precondition(user):
    print("in user_passes_test")
    print("user: ", user)
    print("is_authenticated? ", user.is_authenticated)
    return True

Вот вывод, который я получаю:

in user_passes_test
user: AnonymousUser
is_authenticated? False

inside view
user: John Doe/john@test.domain
is_authenticated? True

Я не могу понять, почему request.user аноним находится внутри user_passes_test проверки. Я хочу выполнить несколько проверок предусловий на основе пользовательского объекта.

Вот моя последовательность промежуточных продуктов:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Я на Django 3.1.7 и djangorestframework 3.12.3.

Я не могу понять, почему request.user аноним внутри user_passes_test проверки.

При UserPassesTestMixin проверке не проверяется, вошел ли пользователь в систему. Иногда вы можете захотеть проверить свойство, которое может быть True для неавторизованных пользователей. Например, представление, которое должно быть видно только не суперпользователям, или пользователю, который не зарегистрировался (пока), но основано на некоторых переменных сессии.

Вы можете добавить дополнительную проверку с помощью LoginRequiredMixin миксина [Django-doc]. Но обычно фреймворк Django REST обрабатывает это с помощью permission_classes [DRF-doc]:

from rest_framework import permissions
from rest_framework.permissions import IsAuthenticated

class UserPassesSomeTest(permissions.BasePermission):
    message = 'Some custom message'

    def has_permission(self, request, view):
        user = request.user
        print("in user_passes_test")
        print("user: ", user)
        print("is_authenticated? ", user.is_authenticated)
        return True

class home(APIView):
    permission_classes = (IsAuthenticated, UserPassesSomeTest)
    
    # …
Вернуться на верх