DRF APITestCase force_authenticate заставляет request.user возвращать кортеж вместо объекта User
У меня есть пользовательский класс аутентификации, соответствующий документации
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
username = request.META.get('HTTP_X_USERNAME')
if not username:
return None
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise exceptions.AuthenticationFailed('No such user')
return (user, None)
и я использовал его в своем APIView:
class profile(APIView):
permission_classes = ()
authentication_classes = (ExampleAuthentication,)
def get(self, request, format=None):
try:
print('user', request.user)
serializer = GetUserSerializer(request.user)
return JsonResponse({'code': 200,'data': serializer.data}, status=200)
except Exception as e:
return JsonResponse({'code': 500,'data': "Server error"}, status=500)
когда я пытаюсь вызвать его нормально из API через postman, я получаю следующий результат печати, и он работает нормально:
user Пользователь(143)
Я написал тест, используя force_authenticate():
class BaseUserAPITest(APITestCase):
def setUp(self):
# self.factory = APIRequestFactory()
self.user = models.User.objects.get_or_create(
username='test_user_1',
uid='test_user_1',
defaults={'agent_type': 1}
)
def test_details(self):
url = reverse("api.profile")
self.client.force_authenticate(user=self.user)
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
Я получил ошибку сервера, потому что печать request.user
возвращает кортеж вместо объекта User, это печать из журнала тестирования
user (<User: User(143)>, True)
Я пробовал искать и кажется, что нет результатов или объяснений, почему это происходит
Моя версия:
django==2.2.8
djangorestframework==3.10.2
Проблема не в force_authenticate
, а в методе get_or_create
. Он возвращает кортеж. Первый элемент кортежа - объект, а второй - булево число, указывающее, был ли создан объект или нет. Для исправления измените код в методе setUp
на следующий:
def setUp(self):
# self.factory = APIRequestFactory()
self.user, _ = models.User.objects.get_or_create(
username='test_user_1',
uid='test_user_1',
defaults={'agent_type': 1}
)