Метод force_login

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

Синтаксис

pythonclient.force_login(user, backend=None)

Пример

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

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

class ProfileViewTest(TestCase):
  def setUp(self):
    self.client = Client()
    self.user = User.objects.create_user(
      username="testuser",
      password="testpassword"
    )

  def test_profile_page_with_force_login(self):
    self.client.force_login(self.user)
    response = self.client.get(reverse("profile"))
    self.assertEqual(response.status_code, 200)
    self.assertContains(response, "Welcome, testuser")

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

python"Test passed successfully"

Пример

Давайте принудительно аутентифицируем суперпользователя и проверим доступ к админке:

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

class AdminViewTest(TestCase):
  def setUp(self):
    self.client = Client()
    self.admin_user = User.objects.create_superuser(
      username="admin",
      email="admin@example.com",
      password="adminpassword"
    )

  def test_admin_access_with_force_login(self):
    self.client.force_login(self.admin_user)
    response = self.client.get(reverse("admin:index"))
    self.assertEqual(response.status_code, 200)
    self.assertContains(response, "Django administration")

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

python"Test passed successfully"

Пример

Давайте сравним force_login и login методы на примере:

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

class LoginComparisonTest(TestCase):
  def setUp(self):
    self.client = Client()
    self.user = User.objects.create_user(
      username="testuser",
      password="testpassword"
    )

  def test_force_login_vs_login(self):
    # force_login - прямой доступ без проверки пароля
    self.client.force_login(self.user)
    response1 = self.client.get(reverse("dashboard"))
    self.assertEqual(response1.status_code, 200)

    # login - требует правильного пароля
    self.client.logout()
    success = self.client.login(
      username="testuser",
      password="testpassword"
    )
    self.assertTrue(success)
    response2 = self.client.get(reverse("dashboard"))
    self.assertEqual(response2.status_code, 200)

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

python"Both login methods worked successfully"

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

  • метод login,
    который выполняет реальный вход пользователя через форму аутентификации
  • метод logout,
    который выполняет выход текущего пользователя из системы
  • класс TestCase,
    который предоставляет тестовую среду с клиентом и фикстурами
  • атрибут session,
    который предоставляет доступ к сессии тестового клиента