Как истечь сеанс из-за бездействия в Django?

| | | | | | | | | | | | | | | | | |

Наше приложение Django имеет следующие требования к управлению сеансом.

  1. Сеансы истекают, когда пользователь закрывает браузер.
  2. Сеансы истекают после периода бездействия.
  3. Определять, когда срок действия сеанса истекает из-за бездействия, и отображать соответствующее сообщение для пользователя.
  4. Предупреждать пользователей о приближающемся истечении сеанса за несколько минут до окончания периода бездействия. Наряду с предупреждением предоставьте пользователям возможность продлить сеанс.
  5. Если пользователь выполняет длительную работу в приложении, не связанную с отправкой запросов на сервер, время ожидания сеанса не должно истекать. .

После прочтения документации, кода Django и некоторых сообщений в блогах, связанных с этим, я пришел к следующему подходу к реализации.

Требование 1< /strong>
Это требование легко реализовать, установив для параметра SESSION_EXPIRE_AT_BROWSER_CLOSE значение True.

Требование 2
Я видел несколько рекомендаций по использованию SESSION_COOKIE_AGE для установки срока действия сеанса. период. Но у этого метода есть следующие проблемы.

  • Сеанс всегда истекает в конце SESSION_COOKIE_AGE, даже если пользователь активно использует приложение. (Этого можно избежать, установив истечение срока действия сеанса до SESSION_COOKIE_AGE при каждом запросе с использованием специального промежуточного программного обеспечения или путем сохранения сеанса при каждом запросе путем установки SESSION_SAVE_EVERY_REQUEST в true. Но следующая проблема неизбежна из-за использования SESSION_COOKIE_AGE.)

  • Из-за того, как работают файлы cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE и SESSION_COOKIE_AGE являются взаимоисключающими, т. е. срок действия файла cookie либо истекает при закрытии браузера, либо в указанное время истечения срока. Если используется SESSION_COOKIE_AGE и пользователь закрывает браузер до истечения срока действия файла cookie, файл cookie сохраняется, и повторное открытие браузера позволит пользователю (или любому другому лицу) войти в систему без повторной аутентификации.

  • Django полагается только на наличие файла cookie, чтобы определить, активен ли сеанс. Он не проверяет дату истечения срока действия сеанса, хранящуюся вместе с сеансом.

Для реализации этого требования и решения упомянутых выше проблем можно использовать следующий метод.

  • Не устанавливайте SESSION_COOKIE_AGE.
  • Установите дату истечения срока действия сеанса как «текущее время + период бездействия» для каждого запроса.
  • Переопределите process_request в SessionMiddleware и проверьте срок действия сеанса. Отменить сеанс, если он истек.

Требование 3
Когда мы обнаружим, что срок действия сеанса истек (в пользовательском SessionMiddleware выше), установите в запросе атрибут, указывающий на истечение сеанса. Этот атрибут можно использовать для отображения соответствующего сообщения пользователю.

Требование 4
Используйте JavaScript для обнаруживать бездействие пользователя, предоставлять предупреждение, а также возможность продлить сеанс. Если пользователь желает продлить сеанс, отправьте на сервер импульс проверки активности, чтобы продлить сеанс.

Требования t 5
Используйте JavaScript для обнаружения активности пользователя (во время длительной бизнес-операции) и отправки импульсов подтверждения активности на сервер, чтобы предотвратить истечение срока действия сеанса.


Приведенный выше подход к реализации кажутся очень сложными, и мне было интересно, может ли быть более простой метод (особенно для требования 2).

Мы будем очень признательны за любую информацию.