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
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'.
Ho eseguito l'upsup della risposta accettata, ma si noti che è anche possibile utilizzare il metodo decorator_from_middleware per abilitare selettivamente il middleware su una base per visualizzazione. Vedi le risposte StackOverflow a Non-global middleware in Django per maggiori dettagli.
È 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.
- 1. sessioni di login per django
- 2. Disabilita l'impaginazione in django-tables2?
- 3. Disabilita l'impaginazione in Django tasteypie?
- 4. Creazione e distruzione sicura delle sessioni di accesso in PHP
- 5. Disabilita Annulla per creazione/eliminazione di NSManagedObject
- 6. Le sessioni di Django non funzionano in Internet Explorer
- 7. Creazione matrice JSON in Django
- 8. Creazione di ricerche campo personalizzate in Django
- 9. Creazione di UTF-8 JsonResponse in Django
- 10. Creazione di superuser in django-nonrel
- 11. Django disabilita la modifica (ma consente l'aggiunta) nella vista TabularInline
- 12. Disabilita il completamento automatico sul campo di testo in Django?
- 13. Come iniziare con le sessioni in Google App Engine/Django?
- 14. sessioni differenti per admin e applicazioni in Django
- 15. oggetto modello di Django con la creazione di chiave esterna
- 16. Come disabilitare la creazione automatica dell'ID in Django?
- 17. Errore "TemplateDoesNotExist" con la creazione di Sitemap per l'app Django
- 18. Disabilita cookie utente anonimo con Django
- 19. Sessioni CodeIgniter vs sessioni PHP
- 20. Come escludere la suoneria NewRelic RPM dalla creazione di sessioni inutili nel database
- 21. RavenDB Provider di sessioni ASP.NET?
- 22. Creazione di molti oggetti utilizzando django-polimorfico
- 23. Sessioni in freccetta
- 24. UITableViewController - disabilita la selezione
- 25. Sessioni in PHP 7
- 26. Come posso creare sessioni persistenti in PHP?
- 27. Creazione modulo django su init
- 28. Sessioni utente Django con stickiness Load Balancer AWS disattivato
- 29. Symfony2 disabilita la cache?
- 30. use_strict_mode in sessioni php
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. –
Questo mi sembra quello di cui avevo bisogno. Un consiglio: usa 'se reqest.path_info.startswith ('/ api /')' invece di affettare la stringa. –
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) –