Django测试客户端方法覆盖标头

Iwa*_*993 12 python django put django-rest-framework x-http-method-override

我试图在我的视图集上测试我的更新方法.视图集是取自drf的模型视图集.要更新我需要发送一个put请求.由于并不总是支持这两种方法告诉服务器我正在发出一个put请求,第一种不符合我需要的方法是使用一个额外的字段来调用_method并设置它put.由于我需要发布json数据,我需要使用第二种方式,它使用X-HTTP-Method-Override标头.

要在测试用例中发布我的数据,请使用以下代码:

header = {'X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)
Run Code Online (Sandbox Code Playgroud)

但不幸的是,我得到的结果是{'detail':'Method POST not allowed.'}.我使用插件(Postman)测试了服务器的行为,我也指定了X-HTTP-Method-Override标头.没有例外.我现在需要知道如何正确地将标头传递给django测试客户端,否则测试会在这里变得非常烦人.

Rah*_*pta 28

您需要指定标题,'HTTP_X_HTTP_METHOD_OVERRIDE'而不是在标题的开头'X_HTTP_METHOD_OVERRIDE'添加ie HTTP_.

header = {'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)
Run Code Online (Sandbox Code Playgroud)

Django文档:

META通过将所有字符转换为大写,将所有字符替换为下划线并为名称添加HTTP_前缀,将请求中的HTTP标头转换为键.因此,例如,调用的标头X-Bender将映射到META密钥HTTP_X_BENDER.

  • 为什么在文档中很难找到这个 eff!? (5认同)
  • @KeatsKelleher - 更大的问题是为什么会出现这种行为?无论如何,我在尝试在测试中使用 cookie 时遇到了基本上相同的问题 - 要传递 cookie,我需要执行 `header = {'HTTP_COOKIE': 'position=44.4444,-77.7777'}` (4认同)

use*_*ame 12

此外,您可以将标头传递给客户端的构造函数:

from django.test import Client

client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734")
Run Code Online (Sandbox Code Playgroud)

这样每个请求都将包含默认标头。

PS:此方法对 DRF TestApiClient 和 ApiRequestFactory 有效。