Срок окончания сеанса Django?
Из документации django у меня сложилось впечатление, что вызов:
request.session.set_expiry(300)
из одного представления приведет к истечению сеанса после пяти минут бездействия; однако, это не то поведение, которое я испытываю в сундуке джанго. Если я вызову этот метод из одного представления и просмотрю другие представления, которые не вызывают метод, сеанс истекает через пять минут. Поведение, которое я ожидал, истекало только после пяти минут бездействия, а не просто не вызвало set_expiry снова до истечения срока действия.
Мой вопрос, тогда мне действительно нужно вызвать set_expiry во всех представлениях? Если да, то есть ли какой-нибудь декоратор, который может помочь? Я не могу представить, что это не часть вклада.
Спасибо,
Пит
Ответы
Ответ 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
учтен этот параметр по умолчанию.