2013-02-19 3 views
5

Ich versuche AnonymousUsers zu verfolgen, wenn sie zuerst auf die Website kommen, und wenn sie sich dann auf der Website registrieren.Django: Wie man Sitzungs-Cookie für AnonymousUser ohne Verwendung von SESSION_SAVE_EVERY_REQUEST setzt

Dazu habe ich eine Middleware mit der entsprechenden Funktionalität erstellt, aber zunächst ging man davon aus, dass jedem AnonymousUsers bereits eine Sitzung zugeordnet war (SessionID-Cookie wird in erster Reaktion gesetzt & assoziierte Sitzung ist bereits in django_session angelegt) . Hinweis: Sitzung App & Middleware vorhanden ist

Es scheint, dass dies nicht der Fall ist, wie in der Sitzung Middleware suchen, wenn ein AnonymousUser zuerst auf der Seite kommt, wird die Sitzung nie (Benutzer geändert tun, da ' _auth_user_id‘und '_auth_user_backend' gesetzt sind), und so wird erstellt nie:

SessionMiddleware.process_response

def process_response(self, request, response): 
    """ 
    If request.session was modified, or if the configuration is to save the 
    session every time, save the changes and set a session cookie. 
    """ 
    try: 
     accessed = request.session.accessed 
     modified = request.session.modified 
    except AttributeError: 
     pass 
    else: 
     if accessed: 
      patch_vary_headers(response, ('Cookie',)) 
     if modified or settings.SESSION_SAVE_EVERY_REQUEST: 
      if request.session.get_expire_at_browser_close(): 
       max_age = None 
       expires = None 
      else: 
       max_age = request.session.get_expiry_age() 
       expires_time = time.time() + max_age 
       expires = cookie_date(expires_time) 
      # Save the session data and refresh the client cookie. 
      request.session.save() 
      response.set_cookie(settings.SESSION_COOKIE_NAME, 
        request.session.session_key, max_age=max_age, 
        expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, 
        path=settings.SESSION_COOKIE_PATH, 
        secure=settings.SESSION_COOKIE_SECURE or None, 
        httponly=settings.SESSION_COOKIE_HTTPONLY or None) 
    return response 

Versuch 1

Um zu versuchen, dies zu überwinden, in meiner Middleware, die unterhalb der Session Middleware platziert ist, würde ich zwingen, a() auf der Sitzung speichern, es zu schaffen:

if hasattr(request, 'session') and not request.session.session_key: 
    request.session.save() 

Dies würde bieten die session_key, aber leider, wenn SessionMiddleware.process_response genannt wird, ist request.session.modified noch gleich falsch, und so wird der Sitzungs-Cookie nicht gesetzt ...


Versuch 2

Eine Möglichkeit, dies zu tun, scheint die Sitzung, in einer beliebigen Art und Weise, zu modifizieren, dass request.session.modified == True im SessionMiddleware.process_response zu gewährleisten:

if hasattr(request, 'session') and not request.session.session_key: 
    request.session.save() 
    request.session['some_variable'] = True 

Das scheint mein Problem zu beheben, ohne Rückgriff auf SESSION_SAVE_EVERY_REQUEST, die zuviel des Guten sein würde, aber noch ist es nicht ganz richtig sein ....


Frage

Wie stellen Sie sicher, dass die Sitzung für einen AnonymousUser ohne vorherigen Besuch erstellt wird, ohne die Sitzung explizit zu ändern oder SESSION_SAVE_EVERY_REQUEST=True zu haben?

Danke für Ihre Hilfe!

Antwort

5

Auch eine explizite Änderung der Sitzung kann fehlschlagen (z. B. Zuweisung eines Attributs zu einem Sitzungsattribut).

Sie müssen explizit gesetzt session.modified auf true

if hasattr(request, 'session') and not request.session.session_key: 
    request.session.save() 
    request.session.modified = True 

Werfen Sie einen Blick auf das, was die docs sagen, wenn Sitzungen gespeichert werden.

+0

Danke Aidan, das funktioniert super.Ich bin immer noch nicht klar, warum das Sitzungsmodul keine Sitzung erstellen würde, wenn eine nicht vorhanden ist, aber nur, wenn es "geändert" wird ...? – legrisdev

+0

Ja, ich weiß was du meinst. Freut mich, dass du es trotzdem sortiert hast. –

Verwandte Themen