Как проверить, сколько времени осталось до истечения срока действия сессии? (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 обработает его.

Вернуться на верх