Зарегистрируйтесь, чтобы продолжить обучение

Сессия Python: Веб-разработка (Flask)

Иногда куки не могут вместить в себя необходимые данные. Чтобы избежать этой проблемы, нужно использовать сессии. В этом уроке мы научимся работать с ними во Flask.

Три операции сессии

Сессия — это абстракция поверх механизма кук, которая создана, чтобы удобно работать с индивидуальными пользователями. Она используется, чтобы идентифицировать пользователей, и позволяет отличать их друг от друга. Например, аутентификация на сайтах построена поверх механизма сессии.

Сессии реализуются на уровне конкретных фреймворков. Общий принцип работы сессии сводится к трём операциям:

  • Старт сессии
  • Запись данных в сессию
  • Чтение данных из сессии

При старте сессии мы говорим системе, что хотим начать следить за пользователем. Во многих фреймворках эта операция выполняется неявно — при попытке чтения или записи в сессию.

Set-Cookie: _hexlet_session=CM5DvfXch6M3uPJHyfLDpv52wBe4iu3og domain=.hexlet.io; path=/; expires=Sun, 12 Aug 2018 12:56:51 -0000; secure; HttpOnly

Преимущество сессии

Старт сессии на техническом уровне означает установку специальной куки в браузер. Обычно она содержит идентификатор сессии, который уникален для каждого пользователя. Данные сессии могут храниться где угодно, это зависит от конкретной реализации. В этом одно из ключевых отличий работы с пользователями напрямую через куки или через сессию.

Сессия более высокоуровневая абстракция. Например, во Flask по умолчанию данные сессии хранятся в браузере как куки, но подписаны криптографическим ключом. Чтобы хранить сессии на стороне сервера, существует несколько расширений Flask. Из этого следует сразу два вывода:

  • Сессия ограничена только физическим пространством дисков
  • Данные хранятся на сервере, что безопаснее

Если этого недостаточно, например, серверов больше чем один, то буквально парой строк кода в конфигурации можно изменить тип хранилища с файлов на базу данных.

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

Рассмотрим следующий код, который показывает работу сессий во Flask:

import os
from flask import Flask, session


app = Flask(__name__)
# Секретный ключ, который используется для криптографической подписи файла сессии
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")

if session.get("count") is None:
    session["count"] = 0
else:
    session["count"] += 1

print(session["count"])

Этот простой скрипт демонстрирует работу сессий во Flask. Сессия в Flask представлена объектом похожим по поведению на обычный словарь. В отличие от остальных глобальных объектов для работы с HTTP, объект session изменяемый, мы можем работать с ним используя стандартные подходы для словарей.

Всё, что добавится в него, автоматически попадает в сессию и сохраняется между запросами. Это происходит до тех пор, пока кука не будет удалена или изменена.

Даже из этого простого примера видно, что сессия упрощает работу с пользователем. Кроме того, значением объекта session может быть любая составная структура, список, кортеж, словарь или объект. Механизм сессий автоматически беспокоится о сериализации и десериализации.

Замена куки на сессии

Перепишем наш пример добавления товаров в корзину и используем для этого сессию:

@app.route("/cart-items")
def cart_items():
    # Информация о добавляемом товаре
    item = request.args.get("item")

    # Добавление нового товара
    session["cart"].append(item)

    return redirect("/")

После замены куки на сессию ушла значительная часть кода: кодирование и декодирование в JSON, извлечение куки, перезапись куки.

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

  1. Обновление куки с установкой даты в прошлое
  2. Обнуление хранилища сессии и очищение объекта session.clear()

Только в этом случае сессия уничтожится полностью. Первый шаг можно не делать, но второй желательно.

У сессий во Flask много тонкостей и механизмов для управления ими. Если интересно подробнее разобраться в этой теме, изучайте официальную документацию.


Самостоятельная работа

  1. Реализуйте абстракцию репозитория
  2. Переделайте способ хранения пользователей на session

Эталонное приложение


Дополнительные материалы

  1. Официальная документация
  2. Расширение Flask-Session

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff