Как проверить, сколько времени осталось до истечения срока действия сессии? (Django)
С помощью "views. py" как показано ниже, я пытаюсь проверить сколько осталось времени истечения сессии установив "60" секунд времени истечения но после "20" секунд сна, get_expiry_age(), get_session_cookie_age() и get_expiry_date() не вернули "40" секунд времени истечения, что ожидалось:
# "views.py"
from django.shortcuts import render
import time
def test(request):
request.session.set_expiry(60) # "60" seconds expiry time is set
time.sleep(20) # Sleep for "20" seconds
print(request.session.get_expiry_age()) # 60
print(request.session.get_session_cookie_age()) # 1209600
print(request.session.get_expiry_date()) # 2022-08-07 00:34:41.700828+00:00
return render(request, 'test/index.html')
Итак, есть ли способы проверить сколько осталось времени истечения сессии?
Я думаю, что пока он находится в вашем представлении, expiry_age исходного запроса не будет обновлен, и он будет обновлен после того, как ваш ответ передаст process_response
в SessionMiddleware
.
Если вы посмотрите исходный код, то увидите следующее
в set_expiry устанавливается значение в self['_session_expiry'] = value.
def set_expiry(self, value):
"""
Set a custom expiration for the session. ``value`` can be an integer,
a Python ``datetime`` or ``timedelta`` object or ``None``.
If ``value`` is an integer, the session will expire after that many
seconds of inactivity. If set to ``0`` then the session will expire on
browser close.
If ``value`` is a ``datetime`` or ``timedelta`` object, the session
will expire at that specific future time.
If ``value`` is ``None``, the session uses the global session expiry
policy.
"""
if value is None:
# Remove any custom expiration for this session.
try:
del self['_session_expiry']
except KeyError:
pass
return
if isinstance(value, timedelta):
value = timezone.now() + value
self['_session_expiry'] = value
и затем в get_expiry_age используется тот же ключ, если он существует, чтобы показать вам возраст истечения срока действия.
def get_expiry_age(self, **kwargs):
"""Get the number of seconds until the session expires.
Optionally, this function accepts `modification` and `expiry` keyword
arguments specifying the modification and expiry of the session.
"""
try:
modification = kwargs['modification']
except KeyError:
modification = timezone.now()
# Make the difference between "expiry=None passed in kwargs" and
# "expiry not passed in kwargs", in order to guarantee not to trigger
# self.load() when expiry is provided.
try:
expiry = kwargs['expiry']
except KeyError:
expiry = self.get('_session_expiry')
if not expiry: # Checks both None and 0 cases
return self.get_session_cookie_age()
if not isinstance(expiry, datetime):
return expiry
delta = expiry - modification
return delta.days * 86400 + delta.seconds
если вы установите срок действия в представлении и вернете ответ, новый срок действия будет виден во всех последующих запросах, но вы не сможете использовать его в том же представлении до того, как ваш SessionMiddleware
обработает его.