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()

Основные принципы: Объект g используется только для обмена данными в рамках одного запроса. Не храните в g данные, относящиеся к разным запросам, и не храните в g информацию, которая должна сохраняться.

Другие расширения