Тест 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)
# …