Python Django测试客户端方法重写头
我正在尝试在我的视图集上测试我的更新方法。视图集是取自drf的modelviewset。要更新,我需要发送一个put请求。由于这并不总是受支持,有两种方法可以告诉服务器我正在发出put请求,第一种不符合我的需要的方法是使用一个附加字段来形成名为Python Django测试客户端方法重写头,python,django,django-rest-framework,put,x-http-method-override,Python,Django,Django Rest Framework,Put,X Http Method Override,我正在尝试在我的视图集上测试我的更新方法。视图集是取自drf的modelviewset。要更新,我需要发送一个put请求。由于这并不总是受支持,有两种方法可以告诉服务器我正在发出put请求,第一种不符合我的需要的方法是使用一个附加字段来形成名为\u method的表单,并将其设置为put。当我需要发布json数据时,我需要使用第二种方式,即使用X-HTTP-Method-Override头 要在testcase中发布数据,我使用以下代码: header = {'X_HTTP_METHOD_OVE
\u method
的表单,并将其设置为put
。当我需要发布json数据时,我需要使用第二种方式,即使用X-HTTP-Method-Override
头
要在testcase中发布数据,我使用以下代码:
header = {'X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)
但不幸的是,我得到的结果是
{'detail':'methodpost not allowed.}
。我使用一个addon()测试了服务器的行为,其中我还指定了X-HTTP-Method-Override
头。没有提出任何例外。我现在需要知道如何正确地将头传递给django测试客户端,否则这里的测试会非常烦人。您需要将头指定为'HTTP\u HTTP\u METHOD\u OVERRIDE'
,而不是'X\u HTTP\u METHOD\u OVERRIDE'
,即在头的开头添加HTTP\u
header = {'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'}
response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)
从
请求中的HTTP头通过转换被转换为META
键
将所有字符转换为大写,用下划线替换任何连字符
和在名称中添加HTTP
前缀。例如,一个标题
调用的X-Bender
将映射到META
键HTTP\u X\u Bender
此外,还可以将头传递给客户端的构造函数:
from django.test import Client
client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734")
这样,每个请求都将包含默认的头
PS:这种方法适用于DRF TestapClient和ApiRequestFactory。为什么在文档中很难找到eff@KeatsKelleher——更大的问题是,为什么这就是行为?无论如何,我在测试中尝试使用cookie时遇到了基本相同的问题-为了通过cookie,我需要执行
header={'HTTP_cookie':'position=44.4444,-77.7777'}