Метод logout

Метод logout применяется к объекту тестового клиента Client и выполняет выход текущего авторизованного пользователя. После вызова этого метода клиент теряет информацию о сессии пользователя, и все последующие запросы будут выполняться от имени анонимного пользователя. Метод не принимает никаких аргументов и не возвращает значения.

Синтаксис

pythonclient.logout()

Пример . С авторизованным пользователем

Давайте создадим тест, в котором мы авторизуем пользователя, проверим доступ к защищенной странице, затем выполним выход и убедимся, что доступ запрещен:

pythonfrom django.test import TestCase, Client
from django.contrib.auth.models import User
from django.urls import reverse

class LogoutTest(TestCase):
  def setUp(self):
    self.client = Client()
    self.user = User.objects.create_user(
      username='testuser',
      password='testpass123'
    )

  def test_logout_method(self):
    # Login user
    self.client.login(username='testuser', password='testpass123')
    
    # Check access to protected page
    response = self.client.get('/profile/')
    self.assertEqual(response.status_code, 200)
    
    # Logout user
    self.client.logout()
    
    # Check access after logout
    response = self.client.get('/profile/')
    self.assertEqual(response.status_code, 302)

Пример . Работа с сессией

Метод logout также очищает данные сессии пользователя. Рассмотрим пример проверки состояния сессии до и после выхода:

pythonfrom django.test import TestCase, Client
from django.contrib.auth.models import User

class SessionLogoutTest(TestCase):
  def setUp(self):
    self.client = Client()
    self.user = User.objects.create_user(
      username='testuser',
      password='testpass123'
    )

  def test_session_clearing(self):
    # Login and set session data
    self.client.login(username='testuser', password='testpass123')
    session = self.client.session
    session['favorite_color'] = 'blue'
    session.save()
    
    # Check session exists
    self.assertIn('favorite_color', self.client.session)
    
    # Logout
    self.client.logout()
    
    # Check session is cleared
    session = self.client.session
    self.assertNotIn('favorite_color', session)

Результат выполнения кода:

python"Session cleared successfully"

Пример . Проверка состояния пользователя

После вызова logout текущий пользователь становится анонимным. Проверим это с помощью метода is_authenticated:

pythonfrom django.test import TestCase, Client
from django.contrib.auth.models import User

class UserStateTest(TestCase):
  def setUp(self):
    self.client = Client()
    self.user = User.objects.create_user(
      username='testuser',
      password='testpass123'
    )

  def test_user_authentication_state(self):
    # Check initial anonymous state
    response = self.client.get('/some-page/')
    self.assertFalse(response.context['user'].is_authenticated)
    
    # Login
    self.client.login(username='testuser', password='testpass123')
    response = self.client.get('/some-page/')
    self.assertTrue(response.context['user'].is_authenticated)
    
    # Logout
    self.client.logout()
    response = self.client.get('/some-page/')
    self.assertFalse(response.context['user'].is_authenticated)

Смотрите также

  • метод login,
    который выполняет вход пользователя в тестовом клиенте
  • метод force_login,
    который принудительно авторизует пользователя без проверки пароля
  • класс TestCase,
    который предоставляет тестовую среду с поддержкой клиента
  • атрибут client,
    который предоставляет экземпляр тестового клиента в TestCase