我正在开发一个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,如果可能的话,我宁愿不升级。
答案 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
这样,您每次发出请求时都不需要传递标题。