Настройка заголовка 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'))

таким образом, вам не нужно проходить заголовки каждый раз, когда вы делаете запрос.