Flask中validate_on_submit()不生效,不清楚app_context作用该如何解决?
问题核心原因
- 表单实例化位置错误:你将
MyForm实例在服务启动阶段就全局创建,且放在测试请求上下文中,该实例永远不会绑定每一次用户请求提交的表单数据,validate_on_submit()自然无法正常校验。表单实例必须在每一次请求进入视图函数时创建,才能自动关联当前请求的提交数据。 - 多余的上下文声明:正常处理Web请求时,Flask会自动推送应用上下文和请求上下文,你手动写的
app.app_context()和app.test_request_context()完全不需要:app.app_context()是应用上下文,仅用于无活跃请求的离线场景(比如脚本操作数据库、命令行工具),用来访问app绑定的配置、资源等。app.test_request_context()是测试用请求上下文,仅用于单元测试时模拟请求环境,业务代码无需使用。
- 取值逻辑错误:你写的
request.name.data是无效写法,校验通过后应该从表单实例上拿对应字段的data属性。
修复后的代码
main.py
from flask import Flask, render_template, request, flash # 注意如果你的表单文件实际名为wt_form.py,要把下面的the_first_wt_form改成wt_form,否则会导入报错 from the_first_wt_form import MyForm app = Flask(__name__) app.config['SECRET_KEY'] = '934kegn298u54kjgnjdkrbg9u939' # 删掉原来的两个with上下文块和全局表单实例 @app.route('/', methods=['GET', 'POST']) def home(): # 每次请求新建表单实例,POST请求会自动填充提交的数据 a_form = MyForm() # validate_on_submit已经内置了POST请求判断,不需要额外判断request.method if a_form.validate_on_submit(): print("Good job") # 从表单实例拿校验后的数据 name = a_form.name.data email = a_form.email.data password = a_form.password.data print(name, email, password) # 这里可以加后续业务逻辑,比如存数据库之类的 else: print('We messed up') if a_form.errors: for err in a_form.errors.values(): print(f"There was an error with creating user: {err}") flash(f"There was an error with creating user: {err}", category='danger') return render_template('mynewhome.html', form=a_form) if __name__ == "__main__": app.run(debug=True)
补充说明
你原来手动从request.form取数据的逻辑可以删掉,表单校验通过后从表单实例取的是经过类型转换、校验后的安全数据,比直接读request.form更可靠。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

