Flask Глобальные переменные приложения - API объекта g
gпредставляет собой глобальное пространство имён уровня запроса, используемое для обмена данными между несколькими функциями в рамках одного запроса.
Импортируется черезfrom flask import g; доступно только при активном контексте приложения.
Описание объекта g
| Особенности | Описание |
|---|---|
| Type | экземпляр flask.ctx._AppCtxGlobals |
| Жизненный цикл | Создаётся вместе с контекстом приложения, уничтожается вместе с контекстом приложения. |
| Потокобезопасность | Каждый запрос/контекст имеет собственный независимый объект g. |
| Использование | Чтение и запись свойств как у обычных объектов: g.user = ..., g.db = ... |
Методы _AppCtxGlobals
| Методы | Описание |
|---|---|
| get(name, default=None) | Получить значение атрибута; вернуть значение по умолчанию, если атрибут не существует. |
| pop(name, default=None) | Удалить и вернуть значение атрибута. |
| setdefault(name, default=None) | Если атрибут не существует, установить значение по умолчанию и вернуть его. |
| __contains__(name) | Поддерживает hasattr(g, "name") или "name" in g |
Типичные шаблоны использования
Пример
from flask import Flask, g
app = Flask(__name__)
def get_db():
"""Соединение с базой данных создаётся только один раз и сохраняется в g для повторного использования"""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""Загрузить информацию о пользователе в g перед началом запроса"""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # g.user можно использовать напрямую в функции представления
else:
g.user = None
@app.route("/profile")
def profile():
if g.user is None:
return "Вы не вошли в систему"
return f"Привет, {g.user.name}"
@app.teardown_appcontext
def close_db(error):
"""Освобождение ресурсов в конце запроса"""
db = g.pop("db", None)
if db is not None:
db.close()
app = Flask(__name__)
def get_db():
"""Соединение с базой данных создаётся только один раз и сохраняется в g для повторного использования"""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""Загрузить информацию о пользователе в g перед началом запроса"""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # g.user можно использовать напрямую в функции представления
else:
g.user = None
@app.route("/profile")
def profile():
if g.user is None:
return "Вы не вошли в систему"
return f"Привет, {g.user.name}"
@app.teardown_appcontext
def close_db(error):
"""Освобождение ресурсов в конце запроса"""
db = g.pop("db", None)
if db is not None:
db.close()
Другие расширенияОсновные принципы: Объект g используется только для обмена данными в рамках одного запроса. Не храните в g данные, относящиеся к разным запросам, и не храните в g информацию, которая должна сохраняться.