2010-10-29 12 views
17

Sto cercando di disabilitare la creazione automatica di sessioni in Django per determinati URL. Ho/api/* e ogni client che colpisce ottiene una nuova sessione di Django. C'è un modo per ignorare determinati URL?Disabilita la creazione di sessioni in Django

risposta

16

Una soluzione banale a questo è fare in modo che il server Web distingua tra chiamate API e chiamate regolari, quindi avere due diverse istanze WSGI dell'applicazione: una con sessioni abilitate, l'altra con sessioni disabilitate. (Probabilmente è molto più semplice con Nginx che con Apache.)

Un'alternativa è ereditare SessionMiddleware e quindi modificare le funzioni di processo per ignorare tutte le richieste corrispondenti ai criteri. Qualcosa di simile:

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) 

e quindi modificare file del impostazione in modo che MIDDLEWARE_CLASSES contiene il percorso a "MySessionMiddleware" e non 'django.contrib.sessions.middleware.SessionMiddleware'.

+2

Grazie per le informazioni. 1 avvertimento però. Se stai usando l'autenticazione di django è richiesto il middleware di sessione. Anche process_response deve restituire la risposta. –

+2

Questo mi sembra quello di cui avevo bisogno. Un consiglio: usa 'se reqest.path_info.startswith ('/ api /')' invece di affettare la stringa. –

+0

Non dovrebbe process_response restituire l'oggetto risposta? def process_response (self, richiesta di risposta): se request.path_info [0: 5] == '/ api /': ritorno risposta ritorno super (MySessionMiddleware, auto) .process_response (richiesta, risposta) –

0

È anche possibile nel middleware personalizzato, o in qualsiasi altro luogo, sostituire il metodo request.session.save prima che la risposta venga elaborata in SessionMiddleware, dove viene chiamato il metodo.

request.session.save = lambda: None 

Trivial, funziona.

Il vantaggio di questo approccio, sebbene sia di fatto un trucco, è che l'oggetto sessione è ancora accessibile e può essere utilizzato nel modo consueto senza necessità di ulteriori modifiche nel codice.

Problemi correlati