2010-10-29 48 views
17

我正在尋找禁止在Django中爲某些URL自動創建會話。我有/ api/*,每個客戶端都會得到一個新的Django會話。有沒有辦法忽略某些網址?在Django中禁用會話創建

回答

16

一個平凡的解決方案,這是有API調用和定期調用之間你的網絡服務器區分開來,然後讓你的應用程序的兩個不同的WSGI實例:一個會議啓用,其他禁用會議。 (這可能是與Nginx的比Apache的要容易得多。)

另一種方法是繼承SessionMiddleware然後編輯處理功能忽略符合標準的所有要求。喜歡的東西:

from django.contrib.sessions.middleware import SessionMiddleware 

class MySessionMiddleware(SessionMiddleware): 
    def process_request(self, request): 
     if request.path_info[0:5] == '/api/': 
      return 
     super(MySessionMiddleware, self).process_request(request) 

    def process_response(self, request, response): 
     if request.path_info[0:5] == '/api/': 
      return response 
     return super(MySessionMiddleware, self).process_response(request, response) 

並修改設置的文件,這樣MIDDLEWARE_CLASSES包含路徑「MySessionMiddleware」,而不是「django.contrib.sessions.middleware.SessionMiddleware」。

+2

感謝您的信息。 1警告雖然。如果您使用的是django身份驗證,則需要會話中間件。另外process_response需要返回響應。 – 2010-11-18 18:57:06

+2

這看起來像我所需要的。一個提示:使用'如果reqest.path_info.startswith('/ api /')'而不是切分字符串。 – 2011-09-06 10:10:58

+0

process_response不應該返回響應對象嗎? DEF process_response(個體,請求,響應): 如果request.path_info [0:5] == '/ API /': 返回響應 返回超級(MySessionMiddleware,自我).process_response(請求,響應) – 2011-10-27 20:42:08

0

在調用方法的SessionMiddleware中處理響應之前,在自定義中間件或其他任何地方也可以重寫request.session.save方法。

request.session.save = lambda: None 

瑣碎,確實有效。

這種方法的好處,儘管它事實上的一個黑客,是會話對象仍然可以訪問,並且可以使用通常的方式,而不需要在代碼中的任何進一步的修改。