Flask应用使用Blueprint模式访问带表单数据库的路由触发400错误如何解决
问题修复方案
核心错误根因
你遇到的400错误是GET请求场景下强制读取不存在的表单参数导致的:你的路由同时支持GET、POST两种请求方法,首次访问页面时浏览器发起的是GET请求,此时request.form为空,你直接执行id = request.form['id']会触发参数KeyError,Flask默认会将这类未捕获的请求参数异常转为400响应返回。
其他代码问题梳理
- 缺少
Clients模型类导入,调用Clients.query会触发NameError - 未加表单校验逻辑,没有调用
validate_on_submit()判断是否为合法的表单提交,非法请求无法拦截 - 混淆了表单类和模型类:你直接把
ClientsForm表单对象传入db.session.add()试图入库,这是完全错误的用法,应该用表单字段值填充模型类实例再执行入库 - 视图函数名
clients-forms使用了Python语法不允许的中划线,会触发语法错误 - 模板渲染时使用了未定义的变量
cadastro_clientes_form,会触发NameError
修复后的完整代码
from flask import jsonify, render_template, redirect, request, url_for from flask_login import ( current_user, login_required, login_user, logout_user ) from app import db, login_manager from app.cml import blueprint from app.cml.forms import ( ClientsForm, RegisterForm, ComercialForm, SupplierForm, NonConformityForm, TestForm ) # 新增导入Clients模型类(请根据你的实际模型存储路径调整) from app.cml.models import Clients from flask import render_template, redirect, url_for, request from flask_login import login_required, current_user from app import login_manager from jinja2 import TemplateNotFound # 修改视图函数名为符合Python语法的下划线格式 @blueprint.route('/clients-forms.html', methods=['GET','POST']) @login_required def clients_forms(): clients_form = ClientsForm() # 仅POST且表单校验通过时才处理提交逻辑 if clients_form.validate_on_submit(): # 从表单对象读取id字段,不再直接从request.form读取 id = clients_form.id.data registered_clients = Clients.query.filter_by(id=id).first() if registered_clients: return render_template( 'clients-forms.html', msg='Already Registered', success=False, form=clients_form) # 用表单数据填充模型类实例再入库 new_client = Clients() clients_form.populate_obj(new_client) db.session.add(new_client) db.session.commit() return render_template('clients-forms.html', msg='提交成功', success=True, form=clients_form) # GET请求直接返回空表单 return render_template('clients-forms.html', form=clients_form)
额外注意事项
- 请确保你的
ClientsForm表单类已经配置了id字段的校验规则,否则validate_on_submit()会拦截没有id的提交 - 如果你的表单提交时使用了
enctype=multipart/form-data(有文件上传场景),需要在实例化表单时传入request.files参数
内容的提问来源于stack exchange,提问作者SanctaMariaMaterDeiOraProNobis
相关产品推荐
相关产品推荐

