Фреймворк 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:

сессии django - база данных

Данные сеанса представляют собой строку, закодированную с помощью 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@'

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *