2010-10-29 4 views
17

Ich möchte die automatische Sitzungserstellung in Django für bestimmte URLs deaktivieren. Ich habe/api/* und jeder Klient, der trifft, erhält eine neue Django-Sitzung. Gibt es eine Möglichkeit, bestimmte URLs zu ignorieren?Sitzungserstellung in Django deaktivieren

Antwort

16

Eine triviale Lösung besteht darin, dass Ihr Webserver zwischen API-Aufrufen und regulären Aufrufen unterscheiden muss und dann zwei verschiedene WSGI-Instanzen Ihrer Anwendung haben: eine mit aktivierten Sitzungen, die andere mit deaktivierten Sitzungen. (Dies ist wahrscheinlich viel einfacher mit Nginx als mit Apache.)

Eine Alternative besteht darin, SessionMiddleware zu übernehmen und dann die Prozessfunktionen zu bearbeiten, um alle Anfragen zu ignorieren, die Ihren Kriterien entsprechen. Etwas wie:

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) 

Und dann Ihre Einstellung der Datei bearbeiten, so dass MIDDLEWARE_CLASSES den Pfad zu „MySessionMiddleware“ und nicht ‚django.contrib.sessions.middleware.SessionMiddleware‘ enthält.

+2

Danke für die Info. 1 Vorbehalt jedoch. Wenn Sie die Django-Authentifizierung verwenden, ist die Sitzungs-Middleware erforderlich. Auch process_response muss die Antwort zurückgeben. –

+2

Das sieht aus, als was ich brauchte. Ein Tipp: Verwenden Sie 'if reqest.path_info.startswith ('/ api /')' anstatt die Zeichenfolge zu schneiden. –

+0

Sollte die process_response das Antwortobjekt nicht zurückgeben? def process_response (self, Anfrage, Antwort): wenn request.path_info [0: 5] == '/ api /': return response return Super (MySessionMiddleware, Selbst-) .process_response (Request, Response) –

0

Es ist auch möglich, in der benutzerdefinierten Middleware oder an einem anderen Ort die Methode request.session.save zu überschreiben, bevor die Antwort in SessionMiddleware verarbeitet wird, wo die Methode aufgerufen wird.

request.session.save = lambda: None 

Trivial, funktioniert.

Der Vorteil dieses Ansatzes, obwohl es de facto ein Hack ist, besteht darin, dass das Sitzungsobjekt immer noch zugänglich ist und auf die übliche Weise ohne weitere Änderungen im Code verwendet werden kann.

Verwandte Themen