Если вы хотите изменить поведение по умолчанию для механизма сеанса, обычной практикой является создание пользовательского сеанса. К счастью, это не очень сложно. Мы сделаем наш по подклассов 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
См. Обновленный ответ – e4c5