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
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.
Ich habe die akzeptierte Antwort hochgestuft, aber beachten Sie, dass Sie auch die Methode decorator_from_middleware verwenden können, um die Middleware selektiv per Sicht zu aktivieren. Weitere Informationen finden Sie in den StackOverflow-Antworten auf Non-global middleware in Django.
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.
- 1. Paginierung in Django Tastypie deaktivieren?
- 2. django vorübergehend deaktivieren Signale
- 3. Deaktivieren Sie einen Block in Django
- 4. Django - Formular deaktivieren Feldvalidierung wählen
- 5. Sitzungserstellung auf Schienen verhindern 3.2.2 für RESTful api
- 6. hibernate.hbm2ddl.auto set validate verursacht "fehlende Spalte" Ausnahme und verhindert Sitzungserstellung
- 7. Wie Django Query Cache zu deaktivieren?
- 8. Django: Wie Bestellung im Modell deaktivieren
- 9. Deaktivieren Sie anonyme Benutzer-Cookie mit Django
- 10. So deaktivieren Sie die Zwischenabmeldeseite in Django allauth
- 11. Deaktivieren Sie die automatische Vervollständigung auf dem Textfeld in Django?
- 12. Bestellung per E-Mail in Django-oscar deaktivieren
- 13. Wie kann ich die Authentifizierung in Django REST Framework deaktivieren?
- 14. Wie kann ich die Anfrageprotokollierung in Django und uWSGI deaktivieren?
- 15. Django deaktivieren Bearbeitung (aber erlauben Hinzufügen) in TabularInline view
- 16. Wie HTML-Codierung bei Verwendung von Kontext in Django deaktivieren
- 17. Wie kann ich die automatische ID-Erstellung in Django deaktivieren?
- 18. django Vorlage deaktivieren autoescape nicht in statischen Tag arbeiten
- 19. Wie kann ich die Django Sellery Admin Module deaktivieren?
- 20. Wie kann ich die Debug-Protokollierung der Django-Migration deaktivieren?
- 21. Aktionen in django
- 22. Deaktivieren Commit-Objekt Änderungen in SQLAlchemy
- 23. Quarzauftrag in Grails deaktivieren
- 24. Rechtsklick in Silverlight deaktivieren
- 25. Tasteneingabe in TreeView deaktivieren
- 26. Zeilenauswahl in TableView deaktivieren
- 27. Deaktivieren Kunden in Magento
- 28. Deaktivieren Keylistener in Java
- 29. Navigationstasten in Android deaktivieren
- 30. Sitzung in Laravel deaktivieren
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. –
Das sieht aus, als was ich brauchte. Ein Tipp: Verwenden Sie 'if reqest.path_info.startswith ('/ api /')' anstatt die Zeichenfolge zu schneiden. –
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) –