API сессий Flask
Сессия используется для сохранения данных между разными запросами одного и того же пользователя. Flask реализует её с помощью подписанных cookies по умолчанию; данные хранятся на клиенте, но не могут быть подделаны.
Черезfrom flask import sessionимпортируйте и используйте как словарь.
Прокси-объект session
sessionЭто прокси, указывающий на экземпляр SessionMixin текущего запроса. Он доступен только в контексте запроса.
| Атрибуты/Методы | Описание |
|---|---|
| session[key] = value | Установить значение сессии |
| session.get(key, default) | Безопасно получить значение сессии, возвращая default, если ключ не существует. |
| session.pop(key, default) | Удалить и вернуть значение для указанного ключа. |
| session.clear() | Очистить все данные сеанса. |
| "key" in session | Проверить, существует ли ключ |
| session.permanent | Если установлено значение True, сеанс сохраняется после закрытия браузера (используется PERMANENT_SESSION_LIFETIME) |
| session.modified | При изменении изменяемых значений в session (например, при добавлении в список) нужно вручную установить значение True. |
| session.accessed | Если True, то при доступе к сеансу Flask автоматически добавляет заголовок Vary: Cookie |
| session.new | Является ли сеанс только что созданным (некоторые реализации не поддерживают точное определение). |
При изменении вложенных изменяемых объектов в сессии (таких как списки, словари) Flask не может автоматически обнаружить изменение.
Нужно установить вручнуюsession.modified = TrueИначе изменение не будет сохранено в Cookie.
Элемент конфигурации
| Ключ конфигурации | Значение по умолчанию | Описание |
|---|---|---|
| SECRET_KEY | Отсутствует | Секретный ключ для подписи Session; его необходимо задать, чтобы использовать Session. |
| SESSION_COOKIE_NAME | "session" | Имя cookie сессии |
| SESSION_COOKIE_DOMAIN | Отсутствует | Атрибут Domain для Cookie |
| SESSION_COOKIE_PATH | Отсутствует | Атрибут Path для Cookie |
| SESSION_COOKIE_HTTPONLY | True | Запретить доступ JavaScript к Session Cookie |
| SESSION_COOKIE_SECURE | False | Когда True, cookies отправляются только по HTTPS |
| SESSION_COOKIE_SAMESITE | Отсутствует | "Strict", "Lax", или None |
| PERMANENT_SESSION_LIFETIME | timedelta(days=31) | Срок действия постоянной сессии. |
| SESSION_REFRESH_EACH_REQUEST | True | Обновлять срок действия Cookie сессии при каждом запросе. |
Примеры кода
Пример
from flask import Flask, session, redirect, url_for
app = Flask(__name__)
app.secret_key = "your-secret-key"
@app.route("/")
def index():
if "username" in session:
return f'Вы вошли как {session["username"]}'
return 'Вы не вошли в систему'
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
session["username"] = request.form["username"]
# Установить постоянную сессию (сохраняется 31 день после закрытия браузера)
session.permanent = True
return redirect(url_for("index"))
return '<form method="post"><input name="username"></form>'
@app.route("/appends")
def append_to_list():
# Примечание: изменение вложенных списков требует ручной пометки изменённых
if "items" not in session:
session["items"] = []
session["items"].append("new_item")
session.modified = True # Нужно отметить вручную!
return f'Items: {session["items"]}'
@app.route("/logout")
def logout():
session.clear()
return redirect(url_for("index"))
app = Flask(__name__)
app.secret_key = "your-secret-key"
@app.route("/")
def index():
if "username" in session:
return f'Вы вошли как {session["username"]}'
return 'Вы не вошли в систему'
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
session["username"] = request.form["username"]
# Установить постоянную сессию (сохраняется 31 день после закрытия браузера)
session.permanent = True
return redirect(url_for("index"))
return '<form method="post"><input name="username"></form>'
@app.route("/appends")
def append_to_list():
# Примечание: изменение вложенных списков требует ручной пометки изменённых
if "items" not in session:
session["items"] = []
session["items"].append("new_item")
session.modified = True # Нужно отметить вручную!
return f'Items: {session["items"]}'
@app.route("/logout")
def logout():
session.clear()
return redirect(url_for("index"))