【发布时间】:2012-08-01 20:52:12
【问题描述】:
我正在开发一个 Django Web 应用程序,该应用程序(除其他外)需要处理使用 POST 请求发送的事务状态信息。
除了支付网关支持的 HTTP 安全性之外,我的视图还检查了 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 是(可以预见的)None,页面加载正常:
def test_transaction_status_succeeds(self):
response = self.client.post(reverse('transaction_status'), { ... })
self.assertEqual(response.status_code, 403)
但是,我怎样才能伪造成功的提交?我尝试在extra 中设置HTTP_REFERER,例如 self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'}),但这不起作用;该视图显然仍然看到一个空白标题。
测试客户端是否支持自定义标头?如果没有,是否有解决方法?我正在使用 Django 1.1,如果可能的话,我宁愿不升级。
【问题讨论】:
-
这不是你的问题,但对于其他遇到困难的人来说:Django 无法识别我发送的标头,因为我没有按照here 的文档正确转换它们的名称,如described the CGI specification。例如,
X-CSRFToken将是HTTP_X_CSRFTOKEN。在转换它们之后,我可以简单地将它们用作 kwargs,如下面的 supervacuo 的回答所示。
标签: django http-referer django-testing