42

我正在尝试在我的视图集上测试我的更新方法。视图集是从 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)

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

4

2 回答 2

69

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

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

Django 文档中:

请求中的 HTTP 标头META通过将所有字符转换为大写、用下划线替换任何连字符并在 name 中添加HTTP_前缀来转换为键。因此,例如,名为的标头X-Bender将映射到METAkey HTTP_X_BENDER

于 2015-08-09T10:18:45.827 回答
7

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

from django.test import Client

client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734")

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

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

于 2020-04-13T10:30:33.177 回答