Python3 Flask Jinja2模板调用后端自定义函数报未定义错误如何解决
解决方案
错误原因
你之前的方法无效是因为:你在__init__.py中自行创建的独立Template实例,和Flask框架内置的Jinja2渲染环境完全隔离,你给这个独立实例配置的全局函数,Flask渲染模板时不会读取,因此会抛出未定义错误。
修复步骤
1. 正确将函数注册到Flask的Jinja2全局环境
在你的启动文件webapp/main.py中,app实例初始化完成后,添加如下代码:
# 定义函数,注意要匹配模板调用时的传参数量,你模板中传了1个参数,所以函数要设置接收参数 def clever_function(input_val): # 此处替换为你的实际业务逻辑 return f"Hello, your input value is {input_val}" # 将函数注册到Flask内置的Jinja2环境全局变量,所有模板均可直接调用 app.jinja_env.globals['clever_function'] = clever_function
如果你的clever_function定义在其他__init__.py文件中,直接在main.py中导入后再注册即可,无需在多个文件重复定义函数。
2. 修正模板变量匹配问题
你的form.html中输入框的name属性为random,但data.html中循环匹配的是iterations,而且调用函数时使用的random变量未赋值,修改data.html代码如下:
{% set ns1 = namespace(random=None) %} {% for key,value in form_data.items() %} {% if key == "random" %} {%- set ns1.random = value -%} {% endif %} {% endfor %} {{ clever_function(ns1.random) }}
可选方案:单模板传递函数
如果你不需要所有模板都能调用该函数,可以不用全局注册,直接在渲染data.html时将函数作为参数传入:
@app.route('/data', methods = ['POST', 'GET']) def data(): if request.method == 'GET': return f"The URL /data is accessed directly. Try going to '/form' to submit form" if request.method == 'POST': form_data = request.form # 把函数作为参数传给当前模板 return render_template('data.html', form_data = form_data, clever_function=clever_function)
内容的提问来源于stack exchange,提问作者just-another-dude
相关产品推荐
相关产品推荐

