Фреймворк Django sessions в Python с примерами
Django имеет фреймворк сессий, который поддерживает как анонимные, так и пользовательские сессии. Django использует промежуточное программное обеспечение сессий для отправки и получения куки.
На следующем рисунке показано, как работают сеансы Django:
Когда веб-браузер делает первый HTTP-запрос к веб-серверу, промежуточное программное обеспечение сеанса начинает новый сеанс. Промежуточное программное обеспечение сеанса генерирует большое и случайное число, которое называется идентификатором сеанса, и отправляет его обратно в веб-браузер в виде cookie.
Для последующих запросов промежуточное программное обеспечение сеанса сопоставляет значение sessionid в файле cookie, отправленном веб-браузером, с идентификатором сеанса, хранящимся на веб-сервере, и связывает данные сеанса с объектом HTTP-запроса.
Чтобы использовать сеансы, вам необходимо убедиться, что настройки MIDDLEWARE вашего проекта(settings.py) содержат промежуточное программное обеспечение сеанса, например:
MIDDLEWARE = [ # other middleware 'django.contrib.sessions.middleware.SessionMiddleware', # ... ]
Промежуточное программное обеспечение сеанса добавляется в MIDDLEWARE по умолчанию при создании нового проекта с помощью команды startproject.
Промежуточное программное обеспечение сеанса включает сеансы через свойство сеанса объекта запроса(HttpRequest):
request.session
Request.session — это словарь, который позволяет вам хранить и извлекать данные сеанса. Request.session принимает любой объект, который может быть сериализован в JSON по умолчанию.
В отличие от других объектов, request.session сохраняется от одного HTTP-запроса до следующего запроса.
Чтобы установить переменную в сеансе, вы можете использовать request.session следующим образом:
request.session['visit'] = 1
Этот оператор устанавливает переменную посещения на 1.
Чтобы получить ключ сеанса, используйте метод get() объекта request.session:
request.session.get('visit')
Чтобы удалить ключ в сеансе, используйте оператор del:
del request.session['visit']
Настройка Django sessions
По умолчанию Django хранит данные сеанса в базе данных, используя модель сеанса приложения django.contrib.sessions. Однако вы можете выбрать другие движки сеанса, используя SESSION_ENGINE.
Django предоставляет вам следующие возможности хранения данных сеанса:
Параметры | Описание |
---|---|
File-based sessions | Сохраните данные сеанса в django_session базы данных. Это движок по умолчанию. |
Cached sessions | Сохраните данные сеанса в файловой системе. |
Cached database sessions | Сохраните данные сеанса в кэш-бэкенде. Чтобы задать кэш-бэкенд, используйте настройку CACHES. |
Cached database sessions | Сохраните данные сеанса в кэше сквозной записи и базе данных. Если данные отсутствуют в кэше, Django прочитает данные сеанса из базы данных. |
Cookie-based sessions | Сохранять данные сеанса в файлах cookie, которые отправляются в веб-браузер. |
Обратите внимание, что механизм сеансов на основе кэширования обеспечивает лучшую производительность по сравнению с другими механизмами сеансов.
Django поддерживает Memcached из коробки. Кроме того, вы можете найти сторонний пакет для управления бэкэндами кэша для Redis и других систем кэширования.
Помимо SESSION_ENGINE, Django позволяет вам настраивать сессии с помощью определенных настроек. В следующей таблице перечислены наиболее важные из них:
Настройки сеанса | Описание |
---|---|
SESSION_COOKIE_AGE | Длительность сеансовых куки в сеансе. По умолчанию — две недели(1 209 600 секунд) |
SESSION_COOKIE_DOMAIN | Установите домен для сеансовых файлов cookie. |
SESSION_COOKIE_HTTPONLY | Установите значение True, чтобы запретить JavaScript доступ к cookie-файлу сеанса. Значение по умолчанию True, что повышает безопасность от перехвата сеанса пользователя. |
SESSION_COOKIE_SECURE | Установите значение True, чтобы указать, что cookie-файл должен отправляться только в случае HTTPS-соединения. По умолчанию установлено значение False. |
СЕССИЯ_EXPIRE_AT_BROWSER_CLOSE | Установите значение True, чтобы сеанс истекал при закрытии браузера. Значение по умолчанию — False. Если установить значение True, SESSION_COOKIE_AGE не будет иметь никакого эффекта. |
SESSION_SAVE_EVERY_REQUEST | Установите значение True, чтобы сохранить сеанс и обновить срок действия сеанса в базе данных при каждом запросе. По умолчанию установлено значение False. |
Пример Django sessions
Сначала добавьте URL-адрес в urlpatterns в файле urls.py:
urlpatterns = [ path('visit/', views.count_visit, name='visit') ]
При переходе по адресу http://localhost:8000/visit будет выполнена функция count_visit в views.py.
Во-вторых, определите функцию count_visit() в файле views.py:
def count_visit(request): visit = request.session.get('visit',0) + 1 request.session['visit'] = visit return HttpResponse(f"Visit count:{request.session['visit']}")
Функция count_visit() использует request.session для увеличения переменной visit каждый раз, когда вы посещаете URL-адрес http://localhost:8000/visit. Она также отображает текущее значение переменной visit на веб-странице:
Если вы просмотрите файлы cookie в веб-браузере, вы увидите файл cookie с именем sessionid:
Значение sessionid соответствует session_key в таблице django_session:
Данные сеанса представляют собой строку, закодированную с помощью base64. Для ее анализа используется следующий код:
from base64 import b64decode data = base64decode('eyJ2aXNpdCI6MTF9:1ov84c:qngX5Woil1EDwGGylot0OrQtche6734UOApKJ4yp-BA') print(data)
Выход:
b'{"visit":11}\xd6\x8b\xfc\xe1\xca\xa7\x81~V\xa2)u\x10<\x06\x1b)h\xb7C\xabB\xd7!{\xae\xf7\xe1C\x80\xa4\xa2x\xca\x90@'