在Django测试中设置HTTP_REFERER标头

时间:2012-08-03 19:15:11

标签: django http-referer django-testing

我正在开发一个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)

但是,我如何伪造成功的提交?我已尝试在HTTP_REFERER例如 extra中设置self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'}),但这不起作用;该视图显然仍然看到一个空白标题。

测试客户端是否支持自定义标头?如果没有解决方法吗?我正在使用Django 1.1,如果可能的话,我宁愿不升级。

2 个答案:

答案 0 :(得分:19)

几乎是正确的。实际上是:

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

whatever时,我错过了**(分散运算符/关键字参数解包运算符/ reading the source of test/client.py); extra最终成为函数本身的额外关键字参数的字典。

答案 1 :(得分:1)

您可以将HTTP标头传递给lubridate的构造函数:

library(dplyr)
library(lubridate)

df %>%
  group_by(Hours=floor_date(ymd_hm(paste(Date, Hour)), "1 hour")) %>%
  summarize(Val=sum(Val))

# # A tibble: 7 x 2
#   Hours                  Val
#   <dttm>               <dbl>
# 1 2013-03-06 06:00:00   0   
# 2 2013-03-06 12:00:00   2.30
# 3 2013-03-06 13:00:00  17.0 
# 4 2013-03-06 14:00:00  12.0 
# 5 2013-03-06 15:00:00  21.5 
# 6 2013-03-06 16:00:00   0   
# 7 2013-03-06 19:00:00 -10.0 

这样,您每次发出请求时都不需要传递标题。