Я пытаюсь определить некоторые глобальные константы для своего приложения и обнаружил, что это можно сделать с помощью функции, оформленной как @app.context_processor
.
Однако проблема в том, что у меня нет переменной app
. В моем приложении используется фабрика приложений, и я бы хотел, чтобы она оставалась такой. Есть ли другой способ зарегистрировать функцию как context_processor
для моего приложения?
Один из вариантов, который я видел, — применить декоратор к каждому Blueprint
, а не к приложению. Это то, чего я хотел бы избежать, так как это привело бы к большому количеству дублированного кода.
Спасибо @IMCoins, но я уже сталкивался с этим вопросом. Ответ объясняет, как вы можете украсить каждый отдельный чертеж, что для меня привело бы к большому количеству избыточного кода.
Так вы используете чертежи? Кроме того, вы хотите использовать только декораторы или вы можете зарегистрировать их позже через код?
добавить код, который вы пробовали?
Проблема в том, что в случае с фабриками нет объекта app
. У вас есть функция create_app
, в которой создается приложение.
Таким образом, для установки контекстных процессоров вы можете использовать сам create_app
def create_app(config_filename):
app = Flask(__name__)
app.config.from_pyfile(config_filename)
from yourapplication.model import db
db.init_app(app)
from yourapplication.context_processor import myprocessor
app.context_processor(myprocessor)
from yourapplication.views.frontend import frontend
app.register_blueprint(frontend)
return app
Вы также можете иметь функцию в том же файле app.py (где бы ни была написана функция create_app()). В таком случае вы можете просто зарегистрировать context_processor, не импортируя его.
Другой подход - сделать это в плане, как показано ниже.
Функции процессоров контекста Flask
from flask import Blueprint
thingy = Blueprint("thingy", __name__, template_folder='templates')
@thingy.route("/")
def index():
return render_template("thingy_test.html")
@thingy.context_processor
def utility_processor():
def format_price(amount, currency=u'$'):
return u'{1}{0:.2f}'.format(amount, currency)
return dict(format_price=format_price)
Спасибо! Правильно ли я предполагаю, что myprocessor
в вашем первом примере кода — это функция, не принимающая аргументов, аналогичная функции во втором примере?
@LeeWhite, да, в основном функция процессора, которую вы написали в каком-то другом файле без декоратора.
Просто попробовал, и это сработало как шарм. Большое спасибо!
Возможный дубликат Функции процессоров контекста Flask