这个办法基于以下两个事实:
- Flask Admin 本身是一个 Flask 蓝图
- Flask 的 ModelView 类可以通过
can_delete = True/False
等来关闭/开启相应的操作
所以实现的办法是,给 Flask-Admin 蓝图的before_request_funcs
注册一个check_user_permission
函数,在每次请求之前根据用户的权限来刷新 ModelView 的设置。
而蓝图的before_request
必须要在app.register_blueprint
调用之前,根据 Flask-Admin 创建蓝图和注册蓝图的流程来看,复写 ModelView 的create_blueprint
这个函数就可以了。
1 | class BaseModelView(ModelView): |
这个实现办法还依赖于 Flask-Login 实现的用户登录机制,用户的权限验证在用户的 Model 中进行定义。