2009-12-30 26 views
8

我在應用程序中收到HEAD請求,並想知道如何處理它們。選項包括:在App Engine上使用Django處理HTTP HEAD請求的最佳實踐

  • 將它們轉換爲入眼,過程通常的方式,那麼:
    • 剝離體(雖然我不知道如何 - 似乎response.content = ''不這樣做
    • 它似乎應用發動機自動去掉身體,給予警告

看來這是乾淨的「響應HEAD請求刪除意外的身體」,並能很好地我們寫裝飾器或中間件。

  • 處理每個HEAD請求專門:
    • 這意味着我能避免一些(很多?)情況下的數據存儲訪問。
    • 顯然,設置內容長度標題的中間件將會被這種方法阻止。

還有什麼?我該怎麼辦?在這裏使用App Engine會有所作爲嗎?有細微的細節;如果是這樣,是否有適當的中間件使用?要轉換爲GET,是`request.method =「GET」足夠(它似乎工作)?

回答

10

您是否打算爲您處理HEAD請求的應用程序,還是來自某些匿名源?您當然沒有義務履行HEAD請求。您只需返回狀態碼405(方法不允許),並提供允許標頭GET或任何意思處理。

我不認爲手動設置request.method來GET是有意義的;很可能你只是返回比請求者想要的更大的響應。他們只是想看到響應的標題。如果您不想處理HEAD,請執行405和Allow header方法。

通常,客戶端發送HEAD請求是因爲他們試圖在不需要處理完整響應時聰明起來。他們正在檢查自上次看到響應後內容長度是否發生了變化,或者他們希望看到Last-Modified或Expires標題。

對於您的應用程序來說,優雅地處理HEAD請求肯定是行之有效的,但您不必這樣做。

+1

* Django會自動剝離HEAD請求的響應內容,同時保持頭部不變,因此您可以像處理視圖中的GET請求一樣處理HEAD請求。*從版本[16115](http://code.djangoproject .com/changeset/16115)Django包含方便的[require_safe](http://docs.djangoproject.com/en/dev/topics/http/decorators/#django.views.decorators.http.require_safe)裝飾器,它限制了請求GET和HEAD。 – 2011-05-22 17:37:40

+1

另請注意,HEAD請求已完全由視圖函數處理(甚至requet.GET將被填充)。唯一的區別似乎是空的'response.content'。 – 2011-05-22 18:18:14