将Application Factory与Flask一起使用时,如何将装饰器放在`app`上?

时间:2019-07-19 08:21:50

标签: python flask python-decorators

我正在尝试为我的应用程序定义一些全局常量,并且发现可以用装饰为@app.context_processor的函数来完成此操作。

但是,问题是我没有app变量。我的应用程序使用一个应用程序工厂,我希望保持这种状态。是否有其他方法可以将功能注册为我的应用的context_processor

我看到的一个选择是将装饰器应用于每个Blueprint,而不是将其应用于应用程序。不过,我还是要避免这种情况,因为这会导致很多重复的代码。

1 个答案:

答案 0 :(得分: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

另一种方法是按照如下所示的蓝图进行操作

Flask context processors functions

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)