簡體   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