基本上我想要做的事,如: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