在Django测试中设置HTTP_REFERER头

在Django测试中设置HTTP_REFERER头,django,http-referer,django-testing,Django,Http Referer,Django Testing,我正在开发一个Django web应用程序,它(除其他外)需要处理使用POST请求发送的事务状态信息 除了支付网关支持的HTTP安全性之外,我的视图还检查request.META['HTTP\u REFERER']和settings.py中的一个条目,以防止搞笑业务: if request.META.get('HTTP_REFERER', '') != settings.PAYMENT_URL and not settings.DEBUG: return HttpResponseForb

我正在开发一个Django web应用程序,它(除其他外)需要处理使用
POST
请求发送的事务状态信息

除了支付网关支持的HTTP安全性之外,我的视图还检查
request.META['HTTP\u 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是(可预测的)
正常页面加载:

def test_transaction_status_succeeds(self):
    response = self.client.post(reverse('transaction_status'), { ... })
    self.assertEqual(response.status_code, 403)
但是,我如何才能假装成功提交?我尝试在
extra
中设置
HTTP\u REFERER
,例如
self.client.post(…,extra={'HTTP\u REFERER':'http://foo/bar“})
,但这不起作用;视图显然仍然看到一个空白标题


测试客户端甚至支持自定义头吗?如果没有,是否有解决办法?我使用的是Django 1.1,如果可能的话,我不希望现在就升级。

几乎正确。实际上是:

def transaction_status_suceeds(self):
    response = self.client.post(reverse('transaction_status'), {}, HTTP_REFERER='http://foo/bar')

我错过了一个
**
(分散运算符/关键字参数解包运算符/)当
extra
最终成为函数本身的额外关键字参数字典。

您可以将HTTP头传递给
客户端的构造函数:

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'))

这样,您就不必在每次发出请求时都传递标题。

这不是您的问题,但对于其他遇到我所遇到困难的人来说:Django无法识别我发送的标题,因为我没有正确地转换它们的名称(如文档所示)。例如,
X-CSRFToken
将是
HTTP\u X\u CSRFToken
。在转换它们之后,我可以简单地将它们用作kwargs,如下面supervacuo的回答中所示。当尝试使用此选项时,我得到了一个“\uu init\uuuuuuuuuuuuuuuuuuz()得到了一个意外的关键字参数‘HTTP\u REFERER’”。也许在较新版本的django?@StevenRogers中它发生了变化,听起来你可能已经做了
c=Client(HTTP\u REFERER=)http://foo/bar)
(我能想到的唯一一件事就是调用
\uuuu init\uuuu
)。我建议将其添加为
post()
&
get()
;我刚刚在Django 1.7.3上测试了它,它似乎工作得很好……值得一提的是,
HTTP_头
将在从
client.get
client.post产生的重定向后得到更新。这对我来说一开始并不明显。你好,Max Malysh,我应该把你的HTTP头放在哪里?在.htaccess文件中,还是在php代码中?