2017-02-04 4 views
2

Ich möchte benutzerdefinierte Django Middleware (Django 1.9) verwenden, um zu überprüfen, ob ein anonymer Benutzer die Bedingungen einer Website akzeptiert hat - Ich werde dem Benutzer einen Dialog zeigen, wenn sie noch nicht haben Klicken Sie auf "Zustimmen".Setzen von Cookies in Django Middleware

Ich habe keine Notwendigkeit, dies in der Datenbank zu speichern und würde lieber ein Cookie verwenden. Ich habe nach dem in settings.py:

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    ... 
    'myapp.middleware.app_custom_middleware.TermsMiddleware',] 

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' 

ich dann etwas sehr rudimentär in TermsMiddleware versucht - hier bin mir bewusst die Anfrage und die Antwort zu ändern versuchen, nur um zu versuchen, es zu bekommen zu arbeiten:

class TermsMiddleware(object): 

    def process_request(self, request): 
     request.session['myCookieKey'] = 'myCookieValue' 
     request.session.save() 
     return 

    def process_response(self, request, response): 
     request.session['myCookieKey'] = 'myCookieValue' 
     request.session.save() 
     return response 

Wenn ich die Antwort im Browser kontrollieren, ich sehe, dass myCookieKey nicht gesetzt werden, so dass ich glaube, ich habe verstanden, wie diese geschrieben werden sollen.

Kann ich die Sitzung innerhalb der Middleware so manipulieren, dass sie in dem Cookie wirksam wird, der in der Antwort gesendet wird, die Django sowieso senden würde? Die Dokumentation klingt so, als ob ich in der Lage wäre:

Es sollte entweder None oder ein HttpResponse-Objekt zurückgeben. Wenn es None zurückgibt, wird Django mit der Verarbeitung dieser Anforderung fortfahren und eine beliebige andere process_request() Middleware, dann process_view() Middleware, und schließlich die entsprechende Ansicht ausführen. Wenn es ein HttpResponse Objekt zurückgibt, wird Django nicht stören, irgendeine andere Anforderung, Ansicht oder Ausnahmemiddleware oder die passende Ansicht zu nennen; es wird die Antwort Middleware auf diese HttpResponse anwenden und das Ergebnis zurückgeben.

Ich habe auch die Notiz in der Dokumentation zu SessionStore() außerhalb der View-Funktion zu verwenden. In der Theorie glaube ich nicht, dass ich das hier tun sollte, weil ich Zugriff auf request (und response) habe. Ich habe es trotzdem versucht und konnte es immer noch nicht zur Arbeit bringen.

Hilfe sehr geschätzt!

Antwort

2

Die Sache, die Sie missverstanden haben, ist die Beziehung zwischen der Sitzung und den Cookies.

Sie können keine willkürlichen Cookies durch Ändern der Sitzung festlegen. Die Sitzung ist eine Sammlung von Daten, die normalerweise in der Datenbank oder einer Datei gespeichert sind. Der einzige Cookie ist derjenige, der den Sitzungsschlüssel für den aktuellen Benutzer enthält.

Sie können natürlich die Sitzung in Middleware ändern, aber wo auch immer Sie dies tun, sollten Sie nicht erwarten, dass ein Cookie gesetzt wird.

(Getrennt davon sollten Sie nie einen Doppelanruf unterstreichen Methoden wie __setitem__ direkt Die Sitzung über eine dict-ähnliche Schnittstelle zugegriffen wird.. request.session['foo'] = 'bar')

+0

Danke für die Antwort Daniel - wenn dies der Fall ist, was das tut Dokumentation bedeutet "Cookies enthalten eine Sitzungs-ID - nicht die Daten selbst (außer Sie verwenden das Cookie-basierte Backend)." Der letzte Teil davon scheint es so zu sein, als ob ich die Daten selbst im Cookie sehen sollte (da ich das Cookie-basierte Backend verwende)? Und ja, stimme der Verwendung der dict-Schnittstelle zu - ich bearbeite den obigen Code. –

+1

Aber es ist immer noch der Sitzungscookie, nicht ein bestimmter für jeden Wert.Und in diesem Cookie werden die Sitzungsdaten in einer codierten Form gespeichert; Sie werden keine Schlüssel und Werte sehen. –