Настройка заголовка HTTP REFERER в тесте Django
Я работаю над веб-приложением Django, которое (среди прочего) должно обрабатывать информацию о состоянии транзакции, отправленную с помощью POST
запрос.
в дополнение к безопасности HTTP, поддерживаемой платежным шлюзом, my view проверяет request.META['HTTP_REFERER']
на въезде в settings.py
чтобы попытаться предотвратить смешной бизнес:
if request.META.get('HTTP_REFERER', '') != settings.PAYMENT_URL and not settings.DEBUG:
return HttpResponseForbidden('Incorrect source URL for updating payment status')
теперь я хотел бы выяснить, как проверить это поведение.
я могу сгенерировать сбой достаточно легко;HTTP_REFERER
is (предсказуемо) None
при нормальной загрузке страницы:
def test_transaction_status_succeeds(self):
response = self.client.post(reverse('transaction_status'), { ... })
self.assertEqual(response.status_code, 403)
как, однако, я могу подделать успешное представление? Я пробовал установить HTTP_REFERER
на extra
, например self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'})
, но это не работает; представление, по-видимому, все еще видит пустой заголовок.
поддерживает ли тестовый клиент пользовательские заголовки? Есть ли обходной путь, если нет? Я использую Django 1.1 и предпочел бы пока не обновлять, если это вообще возможно.
2 ответов
почти правильно. Это на самом деле:
def transaction_status_suceeds(self):
response = self.client.post(reverse('transaction_status'), {}, HTTP_REFERER='http://foo/bar')
я пропустил **
(scatter оператор / ключевое слово аргумент распаковки оператор/все) при Читать источник test/client.py
; extra
в конечном итоге является словарем дополнительных аргументов ключевого слова для самой функции.
вы можете передать HTTP-заголовки конструктору Client
:
from django.test import Client
from django.urls import reverse
client = Client(
HTTP_USER_AGENT='Mozilla/5.0',
HTTP_REFERER='http://www.google.com',
)
response1 = client.get(reverse('foo'))
response2 = client.get(reverse('bar'))
таким образом, вам не нужно проходить заголовки каждый раз, когда вы делаете запрос.