【问题标题】:How to put decorators on `app` when using Application Factory with Flask?使用带有 Flask 的 Application Factory 时如何在“app”上放置装饰器?
【发布时间】:2019-11-28 04:58:10
【问题描述】:

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

但是,问题是我没有 app 变量。我的应用程序使用应用程序工厂,我想保持这种方式。是否有其他方法可以将函数注册为我的应用的 context_processor

我见过的一个选项是将装饰器应用于每个Blueprint,而不是将其应用于应用程序。这是我想避免的事情,因为它会导致大量重复代码。

【问题讨论】:

  • 感谢@IMCoins,但这是我已经遇到的问题。答案解释了如何装饰每个单独的蓝图,这会给我带来很多冗余代码。
  • 所以你使用的是蓝图?另外,您是只想使用装饰器,还是可以稍后通过代码注册它们?
  • 添加你试过的代码?

标签: python flask python-decorators


【解决方案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 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)

【讨论】:

  • 谢谢!我是否正确假设您的第一个代码示例中的 myprocessor 是一个不带参数的函数,类似于您的第二个示例中的函数?
  • @LeeWhite,是的,基本上是你在没有装饰器的其他文件中编写的处理器函数
  • 刚刚试了一下,效果很好。非常感谢!
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 2012-12-05
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多