繁体   English   中英

如何使用django.test.Client发出没有Content-Type标头的HTTP请求?

[英]How can I make an HTTP request with no Content-Type header using django.test.Client?

我有一个Django应用程序,该应用程序必须具有以下行为:如果请求没有Content-Type标头,则它将返回错误响应。

为了测试此行为,我需要发出一个没有Content-Type标头的HTTP请求。

django.test模块中使用Client 这有很多方法,包括以下一种:

 post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra) 

在提供的路径上发出POST请求,并返回一个Response对象,如下所述。

[...]

如果提供content_type(例如XML有效负载的text/xml ),则数据内容将使用HTTP Content-Type标头中的content_type在POST请求中按原样发送。

如果您不提供content_type的值,则数据中的值将以multipart/form-data的内容类型multipart/form-data 在这种情况下,数据中的键值对将被编码为多部分消息,并用于创建POST数据有效负载。

该文档说,无论我是否传递content_type参数,总是在请求上设置Content-Type标头。

那么,我还必须以其他什么方式构造一个请求,使其不具有Content-Type标头?

您可以通过类RequestFactory构建自定义的请求实例。

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


以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_TYPE']

而不是pop()来删除它,但前提是您必须确定该键在字典中时才能致命。

我知道这已经有好几年了,但是我有一个相同的问题,并且找到了真正的答案,即如何与测试客户端一起执行此操作:

client.get(url, content_type=None)

至少在Django 2.0上,该请求没有内容类型标头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM