Метод post

Метод post класса Client имитирует HTTP POST-запрос к вашему приложению в тестовой среде. Он принимает URL-адрес, данные для отправки и дополнительные параметры, а возвращает объект Response. Данные обычно передаются в виде словаря, который преобразуется в формат application/x-www-form-urlencoded или multipart/form-data в зависимости от настроек. Этот метод широко используется в тестах для проверки обработки форм, создания объектов через API, авторизации и других операций, требующих отправки данных.

Основные параметры метода:

Синтаксис

pythonfrom django.test import Client

client = Client()
response = client.post(path, data=None, content_type=None, follow=False, secure=False, headers=None, **extra)

Пример

Давайте отправим POST-запрос для создания новой статьи через форму. Предположим, у нас есть модель Article и представление для создания записи:

pythonfrom django.test import Client
from myapp.models import Article

client = Client()
response = client.post('/articles/create/', {
    'title': 'Test Article',
    'content': 'This is a test content.',
    'status': 'published'
  })

print(response.status_code)
print(response.context['form'].is_valid())

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

python"302"
"True"

В ответе мы видим код 302, что означает успешный редирект после создания объекта. Проверим, действительно ли статья была создана в базе данных:

pythonfrom myapp.models import Article

article = Article.objects.get(title='Test Article')
print(article.title)
print(article.status)

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

python"Test Article"
"published"

Пример

Отправим POST-запрос с использованием параметра follow=True для автоматического перехода по редиректам:

pythonfrom django.test import Client
from myapp.models import Article

client = Client()
response = client.post('/articles/create/', {
    'title': 'Another Article',
    'content': 'More content here.',
    'status': 'draft'
  }, follow=True)

print(response.status_code)
print(response.redirect_chain)

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

python"200"
"[('/articles/2/', 302)]"

Пример

Отправим POST-запрос с JSON-данными, изменив content_type на application/json. Это полезно для тестирования API-эндпоинтов, которые ожидают JSON-формат:

pythonfrom django.test import Client
import json

client = Client()
json_data = json.dumps({
    'username': 'testuser',
    'password': 'testpass123'
  })

response = client.post('/api/login/', json_data, content_type='application/json')
print(response.status_code)
print(response.json())

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

python"200"
"{'message': 'Login successful', 'user_id': 1}"

Пример

Отправим POST-запрос с добавлением кастомного HTTP-заголовка и проверкой сессии. Например, для тестирования эндпоинта, требующего авторизации через токен:

pythonfrom django.test import Client

client = Client()
headers = {'Authorization': 'Bearer testtoken123'}
response = client.post('/api/protected/', {
    'action': 'update_status',
    'status': 'active'
  }, headers=headers)

print(response.status_code)
print(response.content)

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

python"200"
"b'{\"message\": \"Status updated successfully\"}'"

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

  • метод get,
    который имитирует GET-запрос к приложению в тестах
  • класс TestCase,
    который используется для написания тестов с поддержкой базы данных
  • метод login,
    который аутентифицирует пользователя для следующих запросов
  • метод force_login,
    который принудительно авторизует пользователя без проверки пароля