6

按照 Flask 页面上的最小示例,我正在尝试构建上下文处理器:

上下文处理器.py

def inflect_this():
    def inflectorize(number, word):
        return "{} {}".format(number, inflectorizor.plural(word, number))
    return dict(inflectorize=inflectorize)

app.py(在应用工厂内)

from context_processor import inflect_this

app.context_processor(inflect_this)

使用之前的变形函数,它根据数字变形单词,很简单,我已经将它作为 jinja 过滤器,但想看看我是否可以将它作为上下文处理器。

鉴于此处页面底部的示例:http://flask.pocoo.org/docs/templating/ 这应该可以工作,但不能。我得到:

jinja2.exceptions.UndefinedError UndefinedError: 'inflectorize' is undefined

我对您的了解还不够,无法看到发生了什么。谁能告诉我出了什么问题?

编辑:

app.jinja_env.globals.update(inflectorize=inflectorize)

用于添加功能,并且似乎比将方法包装在方法中的开销更少,其中 app.context_processor 可能无论如何都会中继到 jinja_env.globals。

4

1 回答 1

21

我不确定这是否完全回答了您的问题,因为我没有使用过应用程序工厂。

但是,我从蓝图尝试了这个,这对我有用。你只需要在装饰器中使用蓝图对象而不是默认的“app”:

东西/view.py

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)

模板/thingy_test.html

<h1> {{ format_price(0.33) }}</h1>

我在模板中看到了预期的“0.33 美元”。

希望有帮助!

于 2012-12-14T02:46:47.097 回答