如何在Jinja模板中调用Python函数并使用函数值返回的字典?

时间:2019-04-23 16:34:15

标签: python templates flask

我有一个从文件读取并返回d {1:'a',2:'b',3:'c'}}字典的函数。

我想将此功能发送到模板,并能够在Jinja模板中调用此功能。

当我在Jinja模板中调用此函数时,我希望能够在模板中使用返回的字典值。我计划使用AJAX在模板中连续调用此函数,以便如果更改文件中的数据,即1:“ a”更改为1:“ f”,则模板中的连续函数调用将更新字典,在模板中使用。

从文件中检索数据的函数称为getdata(),该函数返回数据的字典。

我知道您可以使用.context_processor使函数成为全局函数,并使用模板中的返回值。

@app.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)

然后您可以在模板中调用它。

{{ format_price(0.33) }}

输出$ 0.33

是否可以实现将函数发送到模板并能够调用上下文处理程序访问模板中返回的字典中的特定值的功能?像下面这样。

@app.route('/')
def index():
return render_template('index.html')

@app.context_processor
def context_processor():
    return dict(datadict=getdata())

像这样访问字典中的第一个键。

{{ datadict.1 }}

这将输出“ a”。

这样可能吗?

2 个答案:

答案 0 :(得分:0)

是的,请查看python context objects。我建议使用django或flask之类的框架,以使自己更轻松地将数据从服务器端传递到客户端。如果沿着这条路线走,您只需通过

就可以将数据带到客户端
@app.route('/')
def index():
data: {}
return render_template('index.html', data)

答案 1 :(得分:0)

您可以创建自己的filter

from jinja2 import Environment

d = {1: 'a', 2: 'b', 3: 'c'}

env = Environment()
env.filters["myfilter"] = lambda k: d[k]

template = env.from_string("{{ val | myfilter }}")
print(template.render(val = 3))

打印

c