sup*_*cuo 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')
Run Code Online (Sandbox Code Playgroud)
现在我想弄清楚如何测试这种行为.
我可以很容易地产生故障; HTTP_REFERER是(可预测)None正常的页面加载:
def test_transaction_status_succeeds(self):
response = self.client.post(reverse('transaction_status'), { ... })
self.assertEqual(response.status_code, 403)
Run Code Online (Sandbox Code Playgroud)
但是,如何假冒成功提交?我已经尝试过HTTP_REFERER进入extra,例如 self.client.post(..., extra={'HTTP_REFERER': 'http://foo/bar'}),但这不起作用; 该视图显然仍然看到一个空白标题.
测试客户端是否支持自定义标头?如果没有解决方法吗?我正在使用Django 1.1,如果可能的话,我宁愿不升级.
sup*_*cuo 22
几乎是正确的.它实际上是:
def transaction_status_suceeds(self):
response = self.client.post(reverse('transaction_status'), {}, HTTP_REFERER='http://foo/bar')
Run Code Online (Sandbox Code Playgroud)
在阅读源代码时,我错过了**(分散运算符/关键字参数解包运算符/ 无论如何); 最终成为函数本身的额外关键字参数的字典.test/client.pyextra
您可以将 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'))
Run Code Online (Sandbox Code Playgroud)
这样您就不需要在每次发出请求时都传递标头。
| 归档时间: |
|
| 查看次数: |
8877 次 |
| 最近记录: |