Ошибка входа пользователя Django, все запросы от одного и того же пользователя

Я пытаюсь регистрировать пользователей, используя стандартную систему входа, однако когда пользователь входит в систему, она переписывает все запросы от других пользователей так, как будто они были от пользователя, который только что вошел в платформу

class CustomLoginView(LoginView):

    def __init__(self, **kwargs: Any) -> None:
        super().__init__(**kwargs)

Я сделал несколько тестов, чтобы воспроизвести ошибку:

 @patch('django.middleware.csrf.CsrfViewMiddleware.process_view')
    @patch('djoser.views.settings.PERMISSIONS.user_delete')
    def test_login_user_with_other_session_opened_with_3_users(self, mock_user_delete, mock_process_view):
        mock_process_view.return_value = None
        mock_user_delete.return_value = True
        logger.debug("user created")
        first_user = self.client.post(reverse('rest_framework:login'),data={"username":self.first_user.email, "password":"1am_th30nE"})
        second_user = self.client.post(reverse('rest_framework:login'),data={"username":self.second_user.email, "password":"1am_th30nE"})
        third_user = self.client.post(reverse('rest_framework:login'),data={"username":self.third_user.email, "password":"1am_th30nE"})
        first_user = first_user.client.get(reverse('v1:auth-me'))
        second_user = second_user.client.get(reverse('v1:auth-me'))
        third_user = third_user.client.get(reverse('v1:auth-me'))
        self.assertEqual(first_user.wsgi_request.user.email, self.first_user.email)
        self.assertEqual(second_user.wsgi_request.user.email, self.second_user.email)
        self.assertEqual(third_user.wsgi_request.user.email, self.third_user.email)
   

это возвращает ошибку во всех случаях, потому что email в запросе wsgi всегда является почтой второго пользователя

я понятия не имею о том, что это происходит

В Django, когда вы выполняете действия с объектом self.client в тестах, он использует одну и ту же сессию для всех запросов в рамках одного тестового случая, если только явно не указано, что нужно использовать разные сессии. Вы можете попробовать что-то вроде этого

# Create different client instances for each user
first_client = Client()
second_client = Client()
third_client = Client()

# Login with separate clients
first_user = first_client.post(reverse('rest_framework:login'), data={"username": self.first_user.email, "password": "1am_th30nE"})
second_user = second_client.post(reverse('rest_framework:login'), data={"username": self.second_user.email, "password": "1am_th30nE"})
third_user = third_client.post(reverse('rest_framework:login'), data={"username": self.third_user.email, "password": "1am_th30nE"})

# Fetch authenticated user info
first_user_data = first_client.get(reverse('v1:auth-me'))
second_user_data = second_client.get(reverse('v1:auth-me'))
third_user_data = third_client.get(reverse('v1:auth-me'))

# Assertions
self.assertEqual(first_user_data.wsgi_request.user.email, self.first_user.email)
self.assertEqual(second_user_data.wsgi_request.user.email, self.second_user.email)
self.assertEqual(third_user_data.wsgi_request.user.email, self.third_user.email)

Использование разных экземпляров клиента в тесте было лучше, чтобы избежать путаницы в запросе, но Ван Осем был прав, это было глобальное состояние, которое вызывало такое странное поведение, так что урок здесь в том, что вы должны избегать использования глобального

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