Python 如何使用django.test.Client发出没有内容类型头的HTTP请求?

Python 如何使用django.test.Client发出没有内容类型头的HTTP请求?,python,django,unit-testing,http,http-headers,Python,Django,Unit Testing,Http,Http Headers,我有一个Django应用程序,它必须具有以下行为:如果请求没有内容类型头,它将返回一个错误响应 为了测试这种行为,我需要发出一个没有内容类型的HTTP请求 我正在使用。这有很多方法,包括这个: 在提供的路径上发出POST请求并返回响应对象,如下所述 [……] 如果您提供内容类型(例如,xml有效负载的text/xml),数据内容将按照POST请求中的原样发送,使用HTTPcontent-type标题中的content-type 如果您没有为内容\类型提供值,数据中的值将以多部分/表单数据的内容类

我有一个Django应用程序,它必须具有以下行为:如果请求没有
内容类型
头,它将返回一个错误响应

为了测试这种行为,我需要发出一个没有
内容类型的HTTP请求

我正在使用。这有很多方法,包括这个:

在提供的路径上发出POST请求并返回响应对象,如下所述

[……]

如果您提供内容类型(例如,xml有效负载的
text/xml
),数据内容将按照POST请求中的原样发送,使用HTTP
content-type
标题中的
content-type

如果您没有为
内容\类型
提供值,数据中的值将以
多部分/表单数据
的内容类型传输。在这种情况下,数据中的键值对将被编码为多部分消息,并用于创建POST数据有效负载

文档中说,无论我是否传递了
Content\u Type
参数,都会在请求中设置
Content-Type


那么,我还需要用什么方法来构造请求,使其不具有
内容类型
头?

您可以通过类来构建定制的请求实例

生成后,您可以在将请求实例传递给视图之前对其进行修改


使用RequestFactory文档页面中的示例作为起点,您可以执行以下操作:

from django.test import TestCase, RequestFactory
from .views import my_view

class SimpleTest(TestCase):
    def setUp(self):
        # Every test needs access to the request factory.
        self.factory = RequestFactory()

    def test_details(self):
        # Create an instance of a POST request.
        request = self.factory.post('/your/url', data={'your':'data'})

        # NOW you can customise your request instance!
        # (i.e. remove the Content-Type header)
        request.META.pop('CONTENT_TYPE', None)

        # Actually use the request to test my_view() 
        # as if it were deployed at /customer/details
        response = my_view(request)
        self.assertEqual(response.status_code, 400)
request.META
只是一个标准的Python字典(如上所述),因此您可以使用

del request.META['CONTENT\u TYPE']


而不是
pop()
将其删除,但前提是您非常确定密钥将在字典中。

我知道这已经有好几年了,但我有同样的问题并找到了真正的答案,即如何使用测试客户端:

client.get(url, content_type=None)

至少在Django 2.0上是这样,它发出的请求没有内容类型头。

如果对您来说已经足够了,另一个解决方案(更快、更简单,但更简单)是有一个“空”内容类型头。只需将空字符串传递给post()方法的content_type参数
post('/some/url',data={'some':'data'},content_type='')
client.get(url, content_type=None)