Метод post
Метод post класса Client имитирует HTTP POST-запрос к вашему приложению в тестовой среде. Он принимает URL-адрес, данные для отправки и дополнительные параметры, а возвращает объект Response. Данные обычно передаются в виде словаря, который преобразуется в формат application/x-www-form-urlencoded или multipart/form-data в зависимости от настроек. Этот метод широко используется в тестах для проверки обработки форм, создания объектов через API, авторизации и других операций, требующих отправки данных.
Основные параметры метода:
-
path(обязательный) - URL-адрес, на который отправляется запрос, может быть относительным. -
data(необязательный) - словарь или строка с данными для отправки. Может быть передан какdict,listкортежей или строка в формате JSON. -
content_type(необязательный) - MIME-тип отправляемых данных. По умолчаниюapplication/x-www-form-urlencoded. -
follow(необязательный) - указывает, следует ли автоматически переходить по редиректам. По умолчаниюFalse. -
secure(необязательный) - указывает, следует ли отправлять запрос через HTTPS. По умолчаниюFalse. -
headers(необязательный) - словарь с дополнительными HTTP-заголовками. -
QUERY_STRING(необязательный) - строка запроса, которая будет добавлена к URL.
Синтаксис
from django.test import Client
client = Client()
response = client.post(path, data=None, content_type=None, follow=False, secure=False, headers=None, **extra)
Пример
Давайте отправим POST-запрос для создания новой статьи через форму. Предположим, у нас есть модель Article и представление для создания записи:
from 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())
Результат выполнения кода:
"302"
"True"
В ответе мы видим код 302, что означает успешный редирект после создания объекта. Проверим, действительно ли статья была создана в базе данных:
from myapp.models import Article
article = Article.objects.get(title='Test Article')
print(article.title)
print(article.status)
Результат выполнения кода:
"Test Article"
"published"
Пример
Отправим POST-запрос с использованием параметра follow=True для автоматического перехода по редиректам:
from 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)
Результат выполнения кода:
"200"
"[('/articles/2/', 302)]"
Пример
Отправим POST-запрос с JSON-данными, изменив content_type на application/json. Это полезно для тестирования API-эндпоинтов, которые ожидают JSON-формат:
from 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())
Результат выполнения кода:
"200"
"{'message': 'Login successful', 'user_id': 1}"
Пример
Отправим POST-запрос с добавлением кастомного HTTP-заголовка и проверкой сессии. Например, для тестирования эндпоинта, требующего авторизации через токен:
from 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)
Результат выполнения кода:
"200"
"b'{\"message\": \"Status updated successfully\"}'"
Смотрите также
-
метод
get,
который имитирует GET-запрос к приложению в тестах -
класс
TestCase,
который используется для написания тестов с поддержкой базы данных -
метод
login,
который аутентифицирует пользователя для следующих запросов -
метод
force_login,
который принудительно авторизует пользователя без проверки пароля