【问题标题】:Setting HTTP_REFERER header in Django test在 Django 测试中设置 HTTP_REFERER 标头
【发布时间】: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


【解决方案1】:

几乎是对的。其实是:

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

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

【讨论】:

  • 我在尝试使用它时得到了一个“__init__() 得到了一个意外的关键字参数 'HTTP_REFERER'”。也许它在新版本的 django 中发生了变化?
  • @StevenRogers,听起来你可能已经改用c = Client(HTTP_REFERER='http://foo/bar')(我唯一能想到的就是__init__)。我建议将其作为一个 kwarg 添加到 post()get();我刚刚在 Django 1.7.3 上对此进行了测试,它似乎工作正常……
【解决方案2】:

您可以将 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'))

这样您就不需要在每次发出请求时都传递标头。

【讨论】:

  • 值得一提的是HTTP_HEADER 将在client.getclient.post 产生重定向后更新。起初这对我来说并不明显。
  • 你好 Max Malysh,我应该把你的 HTTP 标头放在哪里?在 .htaccess 文件中,还是在 php 代码中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2018-06-11
  • 2022-08-10
  • 2013-05-01
  • 2016-07-24
  • 2019-08-02
  • 2017-04-06
相关资源
最近更新 更多