2013-02-19 2 views
5

Я пытаюсь отслеживать AnonymousUsers, чтобы выяснить, когда они впервые приходят на сайт, и когда они затем регистрируются на сайте.Django: Как установить sessionid cookie для AnonymousUser без использования SESSION_SAVE_EVERY_REQUEST

Для этого я создал промежуточное программное обеспечение с соответствующей функциональностью, но изначально предполагалось, что у каждого из них есть связанный с ним сеанс (например, 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

Чтобы попытаться преодолеть это, в моем Middleware, который расположен ниже Session Middleware, я бы заставить ворота() на сессии для его создания:

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

Это будет обеспечить session_key, но, к сожалению, когда SessionMiddleware.process_response называется, request.session.modified по-прежнему равна false, и поэтому SessionID печенье не установлен ...


Покушение 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, что было бы излишним, но пока это не кажется совершенно правы ....


Вопрос

Как убедиться, что сеанс создан для анонимного пользователя без предыдущего посещения, без явной модификации сеанса или с SESSION_SAVE_EVERY_REQUEST=True?

Спасибо за помощь!

ответ

5

Даже явное изменение сеанса может завершиться неудачно (например, присвоение атрибута атрибуту сеанса).

Вы должны явно установить session.modified к истинному

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

Взгляните на то, что docs говорят о том, когда сеансы будут сохранены.

+0

Спасибо Aidan, что отлично работает.Я все еще не понимаю, почему сеансовый модуль не создавал сеанс, если он отсутствует, но только когда он «изменен» ...? – legrisdev

+0

Да, я знаю, что вы имеете в виду. Рад, что вы все разобрались. –

Смежные вопросы