如何在Jinja2模板中导入Python库?解决fractions未定义报错
解决Jinja2中fractions未定义的问题
报错原因很明确:模板代码里调用了fractions.Fraction,但调用render()时没有将fractions模块传入模板的上下文环境,导致Jinja2找不到这个对象,抛出UndefinedError。
当然可以实现需求,提供两种可行方案:
方案一:将fractions模块传入模板上下文
修改Python调用代码,把fractions作为参数传给render():
from jinja2 import Template import fractions with open("c.jinja") as f: t = Template(f.read()) a = 2 b = 3 c = 4 d = 5 # 把fractions模块传入模板 print(t.render(a=a, b=b, c=c, d=d, fractions=fractions))
原模板代码保持不变,运行后就能得到期望输出。
方案二:提前在Python中计算好结果再传入模板
如果不想让模板依赖外部模块,可在Python代码中完成分数化简,再把结果传给模板:
Python代码:
from jinja2 import Template import fractions with open("c.jinja") as f: t = Template(f.read()) a = 2 b = 3 c = 4 d = 5 # 计算未化简的分子分母 raw_num = a*d + b*c raw_den = b*d # 化简分数 simplified = fractions.Fraction(raw_num, raw_den) # 传入计算好的所有值 print(t.render( a=a, b=b, c=c, d=d, raw_num=raw_num, raw_den=raw_den, sim_num=simplified.numerator, sim_den=simplified.denominator ))
修改后的模板:
The solution of ${{a}}/{{b}} + {{c}}/{{d}}$ is ${{raw_num}}/{{raw_den}} = {{sim_num}}/{{sim_den}}$.
两种方案运行后,都能得到期望输出:
The solution of $2/3 + 4/5$ is $22/15=22/15$.
内容的提问来源于stack exchange,提问作者somenxavier
相关产品推荐
相关产品推荐

