2013-04-17 73 views
8

我爲我的網站使用django auth,需要安裝會話中間件。使用Django禁用匿名用戶cookie

Django會話中間件始終添加會話cookie,即使對於匿名用戶(未通過身份驗證的用戶)也是如此。當他們進行身份驗證時,cookie將被另一個指示用戶登錄。

我想禁用匿名用戶cookie進行緩存(清漆)。

有沒有辦法在不移除會話中間件的情況下禁用匿名用戶cookie,這對於使用auth的應用來說是必需的?

+0

如果您不在代碼中訪問或修改會話,則不會創建會話。 – sbaechler

回答

7

會話數據在SessionMiddlewareprocess_response的cookie中設置。此功能不使用任何設置或request.user,因此您無法在此方法內知道用戶是登錄用戶還是匿名用戶。所以,你不能禁用發送會話cookie到瀏覽器。

但是,如果你想要這個功能,那麼你可以繼承SessionMiddleware並覆蓋process_response

from django.contrib.sessions.middleware import SessionMiddleware 
from django.conf import settings 

class NewSessionMiddleware(SessionMiddleware): 

    def process_response(self, request, response): 
     response = super(NewSessionMiddleware, self).process_response(request, response) 
     #You have access to request.user in this method 
     if not request.user.is_authenticated(): 
      del response.cookies[settings.SESSION_COOKIE_NAME] 
     return response 

而且你可以代替SessionMiddleware使用NewSessionMiddleware

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'myapp.middleware.NewSessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.doc.XViewMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
) 
+0

我想過子類化,但是request.user.is_authenticated()命中這個類型的檢查數據庫?如果是這意味着每次頁面加載時它會擊中數據庫? – kollo

+0

否'is_authenticated()'不會觸及數據庫。填充'request.user'命中db,它由AuthenticationMiddleware完成。但是,這無論如何都希望發生在所有請求上。但'is_authenticated'只會根據用戶返回True或False,具體如果request.user是'User'的一個實例,它將返回True,如果'request.user'是'AnonymousUser'的一個實例, ,它將返回False。但它不會擊中分貝。 –

+0

好的,謝謝,我會深入研究這個;) – kollo