2013-02-19 123 views
5

我試圖跟蹤AnonymousUsers以確定他們何時第一次訪問該網站,以及他們何時註冊到該網站。Django:如何在不使用SESSION_SAVE_EVERY_REQUEST的情況下爲AnonymousUser設置sessionid cookie

爲此,我創建了一個具有相關功能的中間件,但最初假設每個AnonymousUsers都已經有一個會話與它關聯(即sessionid cookie將在第一個響應中設置爲&關聯會話已在django_session中創建) 。 注:會議應用&中間件存在

看來,這並非如此,因爲在看會話中間件,當一個AnonymousUser首先出現在網站上,會議絕不會被修改(做用戶,因爲' _auth_user_id」和 '_auth_user_backend' 設置),因此,從未創建:

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 

嘗試1

要嘗試克服這一點,在我的中間件,這是擺在下面的會議中間件,我將迫使保存()的會話來創建它:

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

這提供session_key可以,但不幸的是,當SessionMiddleware.process_response被調用時,request.session.modified仍然等於假,所以會話ID的Cookie沒有設置...


嘗試2

的一種方式做到這一點似乎修改會話,以任意方式,以確保request.session.modified == True,在SessionMiddleware.process_response:

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

這似乎解決我的問題,沒有訴諸SESSION_SAVE_EVERY_REQUEST,這將是矯枉過正,但但它似乎並不完全正確....


問題

如何確保爲AnonymousUser創建的會話沒有先前的訪問,沒有明確修改會話,或有SESSION_SAVE_EVERY_REQUEST=True

感謝您的幫助!

回答

5

即使明確修改會話也會失敗(例如,將屬性分配給會話屬性)。

您需要明確設置session.modified爲true

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

看一看什麼docs說,當會話保存在。

+0

非常感謝艾丹。我還不清楚爲什麼會話模塊不會創建一個會話,如果一個不存在,但只有當它被修改時... ...? – legrisdev 2013-02-19 16:02:01

+0

是的,我知道你的意思。很高興你有它分類無論如何。 – 2013-02-19 18:22:08

相關問題