基本上我想要做的事,如:Django的数据保存到会话,而不增加其到期
request.session['last_date'] = datetime.datetime.now()
没有Django的修改(增加)会议EXPIRE_DATE(即,它应该保持,因为它是)
我有SESSION_SAVE_EVERY_REQUEST = True
当last_date如上修改时,会话过期应保持不变。然而,所有其他变更届满应该改变。我不想把它作为会议的全球政策。
基本上我想要做的事,如:Django的数据保存到会话,而不增加其到期
request.session['last_date'] = datetime.datetime.now()
没有Django的修改(增加)会议EXPIRE_DATE(即,它应该保持,因为它是)
我有SESSION_SAVE_EVERY_REQUEST = True
当last_date如上修改时,会话过期应保持不变。然而,所有其他变更届满应该改变。我不想把它作为会议的全球政策。
如果要更改会话引擎的默认行为,通常的做法是编写自定义会话后端。幸运的是,这并不困难。我们将通过从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),
)
大部分的代码是从一些细微的modificiations django.contrib中带给我们的欢乐。现在,所有你需要做的就是告诉Django通过修改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
你能解释一下这是如何工作的吗?我无法理解。注意我不想只为这次更改会话expire_date,而不是像这样全局设置它。这就是为什么我不明白为什么要覆盖SessionStore – user3599803
我不明白你的意见 – e4c5
我的意思是,当我设置'request.session ['last_date'] = datetime.datetime.now()',我*不*想延长session expire_date。但对于其他会话更新,我希望它能正常运行(即在会话保存时延长expire_date)。所以它应该只是一次性行为 – user3599803
请看更新的答案 – e4c5