Метод record_once
Метод record_once применяется к объекту
Blueprint и позволяет отложить выполнение
некоторой функции до момента, когда чертёж
будет впервые зарегистрирован в приложении
через метод register. Это полезно для
операций, которые должны произойти ровно
один раз: настройка расширений, регистрация
фильтров, инициализация глобальных структур.
Первым параметром передаётся функция обратного
вызова, которая принимает объект состояния
чертежа state. Если один и тот же чертёж
регистрируется в нескольких приложениях,
функция будет вызвана отдельно для каждого
приложения, но только один раз на каждое.
Синтаксис
@bp.record_once
def callback(state):
...
Пример
Давайте создадим чертёж и зарегистрируем функцию, которая выполнится один раз при подключении чертежа к приложению:
from flask import Flask, Blueprint
bp = Blueprint('bp', __name__)
@bp.record_once
def init_bp(state):
app = state.app
app.config['BP_INITIALIZED'] = True
print('Blueprint initialized')
app = Flask(__name__)
app.register_blueprint(bp)
Результат выполнения кода:
"Blueprint initialized"
Пример
Давайте используем record_once для
регистрации Jinja-фильтра, который должен
быть добавлен только один раз:
from flask import Flask, Blueprint, render_template
bp = Blueprint('bp', __name__)
@bp.record_once
def register_filters(state):
app = state.app
app.jinja_env.filters['reverse'] = lambda s: s[::-1]
@bp.route('/')
def index():
return render_template('index.html')
app = Flask(__name__)
app.register_blueprint(bp)
Шаблон для примера:
{{ 'abcde'|reverse }}
<-jinja+>
Результат выполнения кода для адреса /:
edcba
<-html+>Смотрите также
-
метод
record,
который регистрирует функцию для каждого экземпляра приложения -
метод
register,
который регистрирует чертёж в приложении -
метод
make_setup_state,
который создаёт объект состояния для чертежа -
метод
template_filter,
который регистрирует пользовательский фильтр шаблонов