Как поместить декораторы в приложение при использовании Application Factory с Flask?

Я пытаюсь определить некоторые глобальные константы для своего приложения и обнаружил, что это можно сделать с помощью функции, оформленной как @app.context_processor.

Однако проблема в том, что у меня нет переменной app. В моем приложении используется фабрика приложений, и я бы хотел, чтобы она оставалась такой. Есть ли другой способ зарегистрировать функцию как context_processor для моего приложения?

Один из вариантов, который я видел, — применить декоратор к каждому Blueprint, а не к приложению. Это то, чего я хотел бы избежать, так как это привело бы к большому количеству дублированного кода.

Возможный дубликат Функции процессоров контекста Flask

IMCoins 19.07.2019 10:43

Спасибо @IMCoins, но я уже сталкивался с этим вопросом. Ответ объясняет, как вы можете украсить каждый отдельный чертеж, что для меня привело бы к большому количеству избыточного кода.

Lee White 19.07.2019 11:19

Так вы используете чертежи? Кроме того, вы хотите использовать только декораторы или вы можете зарегистрировать их позже через код?

Tarun Lalwani 22.07.2019 10:40

добавить код, который вы пробовали?

anjaneyulubatta505 22.07.2019 12:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
745
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что в случае с фабриками нет объекта 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 в вашем первом примере кода — это функция, не принимающая аргументов, аналогичная функции во втором примере?

Lee White 22.07.2019 13:22

@LeeWhite, да, в основном функция процессора, которую вы написали в каком-то другом файле без декоратора.

Tarun Lalwani 22.07.2019 13:30

Просто попробовал, и это сработало как шарм. Большое спасибо!

Lee White 23.07.2019 16:28

Другие вопросы по теме