Django Тестирование клиентского POST-запроса, получение 403 ошибки

Я пытаюсь впервые протестировать некоторые клиентские запросы, и мне удалось успешно отправить POST-запрос для регистрации нового пользователя. Однако, когда я пытаюсь войти в систему, я получаю ошибку 403, и я не уверен, что является причиной этого... может быть, я что-то упустил в тесте? Я успешно могу войти в систему на моем развернутом приложении.

Сообщение об ошибке:

======================================================================
FAIL: test_user_login_POST (jwt_auth.tests.TestUsers)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/jz/Development/BetterCred/jwt_auth/tests.py", line 32, in test_user_login_POST
    self.assertEqual(response.status_code, 202)
AssertionError: 403 != 202

----------------------------------------------------------------------
Ran 3 tests in 1.416s

Тест:

def setUp(self):
        User.objects.create(
            username = 'JohnnyBoy',
            password = 'pass123!',
            email = "email@gmail.com",
            first_name = "John",
            last_name = "Smith",
        )

def test_user_login_POST(self):
        req_url = reverse('user-login')
        login_details = {
            'username': 'JohnnyBoy',
            'password': 'pass123!'
        }

        response = self.client.post(req_url, login_details, content_type="application/json")

        print(response)
        self.assertEqual(response.status_code, 202)

View (я добавил код=404, чтобы проверить, попадает ли мой тест в эту точку, но похоже, что нет):

class LoginView(APIView):

    # POST - Login a user and return a token
    def post(self, request):

        username = request.data.get('username')
        password = request.data.get('password')

        try:
            user_to_login = User.objects.get(username = username)
        except User.DoesNotExist:
            raise PermissionDenied('Invalid credentials.', code = 404)
        
        if not User.check_password(user_to_login, password):
            raise PermissionDenied('Invalid credentials.', code = 404)
        
        exp_time = datetime.now() + timedelta(weeks = 1)

        token = jwt.encode(
            {
                'sub': user_to_login.id,
                'exp': int(exp_time.strftime('%s')),
            }, 
            settings.SECRET_KEY,
            'HS256'
        )

        return Response(
            { 
                'message': f'Welcome back {user_to_login.first_name}!',
                'token': token,
            },
            status.HTTP_202_ACCEPTED
        )

Буду признателен за любые предложения или советы!

Вы не можете просто request.data.get получить json POST запрос. Вы должны сначала обработать данные.

Изменение:

username = request.data.get('username')
password = request.data.get('password')

К этому:

import json
from django.http import JsonResponse
(...)

try:
    json_data = json.loads(request.body)
except json.JSONDecodeError:
    return JsonResponse({"error": "Content is not JSON serializable"}, status=400)

username = json_data.get('username')
password = json_data.get('password')

После дальнейшего чтения документации по тестированию Django я узнал, что я не могу просто установить пароль пользователя, которого я создал для тестирования, напрямую, используя 'password': 'pass123!', а вместо этого должен использовать .set_password(), поскольку пароль должен храниться в правильно хэшированном формате.

Ниже приведен фрагмент соответствующей документации Django для тех, кто столкнется с подобной проблемой в будущем!:

Помните, что если вы хотите, чтобы у вашего тестового пользователя был пароль, вы не можете установить пароль пользователя путем непосредственной установки атрибута password - вы должны использовать функцию set_password(), чтобы сохранить правильно хэшированный пароль. В качестве альтернативы вы можете использовать вспомогательный метод create_user() для создания нового пользователя с правильно хэшированным паролем.

Вернуться на верх