Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django测试客户端方法重写头_Python_Django_Django Rest Framework_Put_X Http Method Override - Fatal编程技术网

Python Django测试客户端方法重写头

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

我正在尝试在我的视图集上测试我的更新方法。视图集是取自drf的modelviewset。要更新,我需要发送一个put请求。由于这并不总是受支持,有两种方法可以告诉服务器我正在发出put请求,第一种不符合我的需要的方法是使用一个附加字段来形成名为
\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'}