如何使用 django.test.Client 发出没有 Content-Type header 的 HTTP 请求?
How can I make an HTTP request with no Content-Type header using django.test.Client?
我有一个 Django 应用程序,它必须具有以下行为:如果请求没有 Content-Type
header,它会 returns 错误响应。
为了测试这个行为,我需要发出一个没有 Content-Type
header.
的 HTTP 请求
我正在使用 the Client
class in the django.test
module。这个有很多方法,包括这个:
post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra)
Makes a POST request on the provided path and returns a Response object, which is documented below.
[...]
If you provide content_type (e.g. text/xml
for an XML payload), the contents of data will be sent as-is in the POST request, using content_type
in the HTTP Content-Type
header.
If you don’t provide a value for content_type
, the values in data will be transmitted with a content type of multipart/form-data
. In this case, the key-value pairs in data will be encoded as a multipart message and used to create the POST data payload.
文档说 Content-Type
header 总是在请求中设置,无论我是否传递 content_type
参数。
那么我还有什么其他方法可以构造一个请求,使其没有 Content-Type
header?
您可以通过class 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 字典(正如 here 所解释的),因此您可以使用
del request.META['CONTENT_TYPE']
而不是 pop()
删除它,但前提是您非常确定密钥将在字典中。
我知道这已经有好几年了,但我有同样的问题并找到了真正的答案,即如何使用测试客户端执行此操作:
client.get(url, content_type=None)
至少在 Django 2.0 上,发出没有内容类型的请求 header。
我有一个 Django 应用程序,它必须具有以下行为:如果请求没有 Content-Type
header,它会 returns 错误响应。
为了测试这个行为,我需要发出一个没有 Content-Type
header.
我正在使用 the Client
class in the django.test
module。这个有很多方法,包括这个:
post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra)
Makes a POST request on the provided path and returns a Response object, which is documented below.
[...]
If you provide content_type (e.g.
text/xml
for an XML payload), the contents of data will be sent as-is in the POST request, usingcontent_type
in the HTTPContent-Type
header.If you don’t provide a value for
content_type
, the values in data will be transmitted with a content type ofmultipart/form-data
. In this case, the key-value pairs in data will be encoded as a multipart message and used to create the POST data payload.
文档说 Content-Type
header 总是在请求中设置,无论我是否传递 content_type
参数。
那么我还有什么其他方法可以构造一个请求,使其没有 Content-Type
header?
您可以通过class 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 字典(正如 here 所解释的),因此您可以使用
del request.META['CONTENT_TYPE']
而不是 pop()
删除它,但前提是您非常确定密钥将在字典中。
我知道这已经有好几年了,但我有同样的问题并找到了真正的答案,即如何使用测试客户端执行此操作:
client.get(url, content_type=None)
至少在 Django 2.0 上,发出没有内容类型的请求 header。