Подтвердить что ты не робот

Срок окончания сеанса Django?

Из документации django у меня сложилось впечатление, что вызов:

request.session.set_expiry(300)

из одного представления приведет к истечению сеанса после пяти минут бездействия; однако, это не то поведение, которое я испытываю в сундуке джанго. Если я вызову этот метод из одного представления и просмотрю другие представления, которые не вызывают метод, сеанс истекает через пять минут. Поведение, которое я ожидал, истекало только после пяти минут бездействия, а не просто не вызвало set_expiry снова до истечения срока действия.

Мой вопрос, тогда мне действительно нужно вызвать set_expiry во всех представлениях? Если да, то есть ли какой-нибудь декоратор, который может помочь? Я не могу представить, что это не часть вклада.

Спасибо, Пит

4b9b3361

Ответ 1

Как автор этих методов, я вижу, что документация не очень понятна в этом отношении. Ваши наблюдения верны: только запросы, которые вызывают изменение сеанса, считаются "активностью".

Вы можете использовать параметр SESSION_SAVE_EVERY_REQUEST, чтобы получить поведение, которое вам нужно (при очевидной стоимости сеанса, который необходимо сохранить каждый запрос).

Ответ 2

Простым промежуточным программным обеспечением, вероятно, будет лучше, чем устанавливать его во всех представлениях. Это то, что я использовал.

class SessionExpiry(object):
    """ Set the session expiry according to settings """
    def process_request(self, request):
        if getattr(settings, 'SESSION_EXPIRY', None):
            request.session.set_expiry(settings.SESSION_EXPIRY)
        return None

Это зависит от SESSION_EXPIRY, установленного в вашей конфигурации. Формат такой же, как request.session.set_expiry.

MIDDLEWARE_CLASSES следует определить с учетом этого порядка:

MIDDLEWARE_CLASSES = (
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    '<yourproject>.<yourapp>.middleware.SessionExpiry',
    ...
}

Было бы неплохо, если бы django.contrib.sessions учтен этот параметр по умолчанию.