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

时间:2015-08-09 09:46:41

标签: python django django-rest-framework put x-http-method-override

我正在尝试在我的视图集上测试我的更新方法。视图集是取自drf的模型视图集。要更新我需要发送一个put请求。由于并不总是支持这两种方法告诉服务器我正在发出一个put请求,第一种不符合我需要的方法是使用一个额外的字段来形成一个名为_method并将其设置为{{1 }}。由于我需要发布json数据,我需要使用第二种方式,它使用put标题。

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

X-HTTP-Method-Override

但不幸的是,我得到的结果是header = {'X_HTTP_METHOD_OVERRIDE': 'PUT'} response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header) 。我使用插件(Postman)测试了服务器的行为,我也指定了{'detail':'Method POST not allowed.'}标头。没有例外。我现在需要知道如何正确地将标头传递给django测试客户端,否则测试会在这里变得非常烦人。

2 个答案:

答案 0 :(得分:21)

您需要将标头指定为String source="{\"query\":\"ether_stat_s\"}"; SearchResponse response = client.prepareSearch("cn_*") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setFrom(0).setSize(10).setExplain(true) .setPostFilter(FilterBuilders.rangeFilter("@timestamp").from(TIMESTAMP_FROM).to(TIMESTAMP_TO)).**setSource(source).**execute().actionGet(); 而不是'HTTP_X_HTTP_METHOD_OVERRIDE',即在标头的开头添加'X_HTTP_METHOD_OVERRIDE'

HTTP_

来自Django documentation:

  

请求中的HTTP标头通过转换转换为header = {'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'} response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header) 个密钥   所有字符都为大写,用下划线替换任何连字符   并在名称中添加META前缀。所以,例如,标题   被叫HTTP_的广告将映射到X-Bender密钥META

答案 1 :(得分:1)

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

from django.test import Client

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

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

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