2016-11-27 9 views
1

В основном я хочу сделать что-то вроде:Джанго сохранить данные сессии без увеличения его истечения

request.session['last_date'] = datetime.datetime.now() 

без Джанго модификации (увеличение) сессии expire_date (т.е. он должен оставаться как есть)

I имеют SESSION_SAVE_EVERY_REQUEST = True

Срок действия сеанса должен оставаться неизменным, если last_date изменен, как указано выше. Однако для всех остальных изменений срок действия должен измениться. Я не хочу устанавливать его как глобальную политику для сеанса.

+0

См. Обновленный ответ – e4c5

ответ

1

Если вы хотите изменить поведение по умолчанию для механизма сеанса, обычной практикой является создание пользовательского сеанса. К счастью, это не очень сложно. Мы сделаем наш по подклассов django.contrib.session.backends.db.SessionStore

из django.contrib.session.backends.db импорта SessionStore в DbStore

class SessionStore(DbStore): 

    def load(self): 
     try: 
      self.current_session = self.model.objects.get(
       session_key=self.session_key, 
       expire_date__gt=timezone.now() 
      ) 
      return self.decode(s.session_data) 
     except (self.model.DoesNotExist, SuspiciousOperation) as e: 
      if isinstance(e, SuspiciousOperation): 
       logger = logging.getLogger('django.security.%s' % e.__class__.__name__) 
       logger.warning(force_text(e)) 
      self._session_key = None 
      return {} 

    def create_model_instance(self, data): 
     """ 
     Return a new instance of the session model object, which represents the 
     current session state. Intended to be used for saving the session data 
     to the database. 
     """ 
     try: 
      expiry = self.current_session.expire_date 
     except AttributeError: 
      expiry = None 

     return self.model(
      session_key=self._get_or_create_session_key(), 
      session_data=self.encode(data), 
      expire_date=self.get_expiry_date(expiry=expiry), 
     ) 

Большая часть кода от django.contrib с несколькими небольшими modificiations. Теперь все, что вам нужно сделать, это сказать Джанго, чтобы использовать наш новый сессионный магазин путем модификации settings.py

SESSION_ENGINE = 'myapp.session' 

Предполагая, что вы поместили выше код в файле с именем session.py

ответ на под редакцией:

Этот код показывает, как изменить сеанс, не изменяя время его истечения. Теперь вы указываете, что хотите этого поведения, только если элемент last_date изменен, внесите изменения следующим образом;

 expiry = None 

     try: 
      if current_session.get('last_date') != date.get('last_date') :  
       expiry = self.current_session.expire_date 
     except AttributeError: 
      pass 
+0

Не могли бы вы объяснить, как это работает? Я не мог понять. Заметьте, что я не хочу менять сеанс expire_date только для этого времени, а не для его глобального назначения. Вот почему я не понимаю, почему переопределить SessionStore – user3599803

+0

И я совсем не понимаю ваш комментарий – e4c5

+0

Я имею в виду, когда я устанавливаю 'request.session ['last_date'] = datetime.datetime.now()', I * do not * хотите продлить сеанс expire_date. Но для других обновлений сеанса у меня есть, я хочу, чтобы он вел себя нормально (например, чтобы продлить expire_date при сохранении сеанса.). Таким образом, это должно быть одноразовое поведение. – user3599803