flask-appbuilder如何在页面展示post_add()方法抛出的异常信息
Flask-AppBuilder 3.3.3 post_add抛出异常前端不显示问题解决
问题原因
Flask-AppBuilder的ModelView新增逻辑中,post_add方法执行在tableA记录提交到数据库之后,默认执行完成后会直接重定向到列表页。你直接抛出的通用Exception只会输出到服务端控制台,不会被推送到前端消息队列,因此用户看不到错误提示。
解决方案
根据是否需要回滚tableA的已插入记录,可选择两种方案:
方案1:无需回滚tableA记录,仅展示错误提示
直接使用Flask自带的flash方法推送错误消息即可,无需抛出异常:
from flask import flash from flask_appbuilder.views import ModelView from flask_appbuilder.models.sqla.interface import SQLAInterface class UploadFilesModelView(ModelView): datamodel = SQLAInterface(UploadFile) def post_add(self, item): try: # 此处为你的tableB插入逻辑 # ...... # 模拟出错场景 if True: raise Exception("自定义错误信息") except Exception as e: # 第二个参数指定消息类型为错误,前端会展示红色提示框 flash(str(e), "error")
方案2:需要回滚tableA记录,避免脏数据
post_add执行时tableA的记录已经完成提交,无法直接回滚。你需要重写add方法,把tableA、tableB的插入逻辑放到同一个事务中:
from flask import flash, redirect, request from flask_appbuilder.views import ModelView from flask_appbuilder.models.sqla.interface import SQLAInterface from sqlalchemy import exc class UploadFilesModelView(ModelView): datamodel = SQLAInterface(UploadFile) def add(self): form = self.add_form.refresh(request.form) if not form.validate_on_submit(): return self.render_template( self.add_template, form=form, title=self.title ) try: # 开启嵌套事务 self.datamodel.session.begin_nested() item = self.datamodel.obj() form.populate_obj(item) self.pre_add(item) # 插入tableA记录 self.datamodel.add(item, raise_exception=True) # 此处为你的tableB插入逻辑 # ...... # 提交整个事务 self.datamodel.session.commit() self.post_add(item) flash("新增成功", "success") return redirect(self.get_redirect()) except (exc.SQLAlchemyError, Exception) as e: # 出错回滚所有操作 self.datamodel.session.rollback() flash(f"操作失败:{str(e)}", "error") # 出错后停留在新增页面,保留用户已填写内容 return self.render_template( self.add_template, form=form, title=self.title )
注意事项
flash方法的第二个参数支持三类值:success(成功提示)、warning(警告提示)、error(错误提示),会对应前端不同样式的提示框- 如果使用方案2,原有
post_add里的非事务逻辑可以保留,事务逻辑移到add方法的对应位置即可
内容的提问来源于stack exchange,提问作者Lin Forest
相关产品推荐
相关产品推荐

