2016-06-08 45 views
0

在我的網站上,Cookie和會話僅用於管理部分中的身份驗證。對於所有其他網址,我不想存儲Cookie或運行會話中間件,因爲它會在每個http請求上創建不必要的數據庫讀/寫。在Django中爲選定頁面禁用會話/ Cookie

有沒有一種方法可以禁用選定頁面的會話中間件,而無需身份驗證中間件抱怨會話中間件丟失?

回答

2

它會在每個http請求上創建一個不必要的數據庫讀/寫。

這是不正確的。如果您嘗試向其中寫入內容,Django只會創建一個會話 - 直到沒有創建會話時,將設置沒有會話Cookie。來自documentation

默認情況下,當會話被修改時,Django只保存到會話數據庫。

請注意,會話cookie僅在創建或修改會話時發送。如果SESSION_SAVE_EVERY_REQUESTTrue,則會在每個請求中發送會話cookie。

SESSION_SAVE_EVERY_REQUEST默認爲False)。

因此,對於你所描述的那種事情,不會爲不訪問管理員的用戶創建會話,也不會有數據庫開銷。唯一的小開銷將是檢查會話cookie的中間件。

+0

我看不到這種行爲。我使用django-debug-toolbar在開發服務器上運行網站。無論打開哪個頁面,我都會在django-debug-toolbar的SQL部分看到以下查詢:'QUERY ='SELECT「auth_user」。「id」,「auth_user」。「password」,「auth_user」。「last_login 「,」auth_user「,」is_superuser「,... FROM」auth_user「WHERE」auth_user「。」id「=%s' - PARAMS =('1',) '。根據你的回答,它應該只發生在管理頁面上,還是我誤解了一些東西? – BartoNaz

+0

仔細檢查,我發現只有在管理頁面中登錄後,此查詢纔會出現,這意味着我的瀏覽器每次都發送cookie。所以這對其他用戶來說不是問題,但我仍然想知道是否可以完全忽略某些URL或視圖的Cookie? – BartoNaz

+0

您子類Django的會話中間件,並添加一些邏輯,在調用父方法之前檢查URL。國際海事組織,你只是用一塊(小)開銷替代另一塊。 – solarissmoke