Flask AppBuilder如何处理含斜杠的数据库变量导致的路由404问题
解决Flask AppBuilder ModelView 带斜杠主键路由404问题
根因
Flask 默认的字符串路由转换器不会识别路径中的斜杠,会将拼接在路由中的10.0.0.1/24拆分为两个独立路径段,导致路由匹配失败,返回404。FAB的ModelView默认直接将主键值拼接进编辑路由,当主键为带斜杠的CIDR、文件路径这类值时就会触发该问题。
解决方案
方案一:修改路由参数转换器(推荐)
直接在对应的ModelView类中指定路由参数使用path转换器即可,该转换器会匹配包含斜杠在内的所有路径字符,无需额外修改其他逻辑:
from flask_appbuilder import ModelView from flask_appbuilder.models.sqla.interface import SQLAInterface from your_app.models import Network # 替换为你自己的网段模型 class NetworkModelView(ModelView): datamodel = SQLAInterface(Network) # 新增以下配置,指定路由参数使用path转换器 route_base_parameter_converter = "path"
方案二:手动URL编码主键值
如果有特殊场景不能修改转换器,可以重写ModelView的编辑URL生成方法,对主键值做URL编码,将斜杠转为%2F,Flask会自动解码拿到原始值:
from urllib.parse import quote from flask_appbuilder import ModelView from flask_appbuilder.models.sqla.interface import SQLAInterface from your_app.models import Network class NetworkModelView(ModelView): datamodel = SQLAInterface(Network) def get_edit_url(self, item): pk_value = quote(str(self.datamodel.get_pk_value(item))) return f"{self.route_url}/edit/{pk_value}"
验证
修改后重启服务,带斜杠的主键值对应的编辑路由即可正常匹配,不会再返回404。
内容的提问来源于stack exchange,提问作者Dimitry Rakhlei
相关产品推荐
相关产品推荐

