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