如何在Flask-Admin普通用户视图中显示指定数据库模型
解决Flask-Admin普通用户仅查看指定表的权限问题
问题根源
当前代码存在两个核心问题:
CarUserView未继承MyModelView,完全缺失权限校验逻辑,无法控制普通用户访问范围- 基础
MyModelView仅允许超级管理员访问,没有为普通用户开放指定表的权限入口
修复方案
1. 重构model_views.py权限逻辑
新增普通用户专属视图类,明确划分不同角色的访问权限:
class MyModelView(sqla.ModelView): def is_accessible(self): if not current_user.is_active or not current_user.is_authenticated: return False # 仅超级管理员可访问此视图及子类 return current_user.has_role('superuser') def _handle_view(self, name, **kwargs): if not self.is_accessible(): if current_user.is_authenticated: abort(403) else: return redirect(url_for('security.login', next=request.url)) # 普通用户可访问的视图基类 class UserAllowedModelView(MyModelView): def is_accessible(self): if not current_user.is_active or not current_user.is_authenticated: return False # 超级管理员或普通用户均可访问 return current_user.has_role('superuser') or current_user.has_role('user') class CarUserView(UserAllowedModelView): column_display_pk = True form_columns = ['id', 'desc'] column_searchable_list = ['desc'] column_filters = ['id'] can_create = True can_edit = True can_delete = False can_view_details = True page_size = 2 create_modal = True edit_modal = True can_export = True class CarAdminView(MyModelView): column_display_pk = True form_columns = ['id', 'desc'] column_searchable_list = ['desc'] column_filters = ['id'] column_editable_list = ['desc'] can_create = True can_edit = True can_delete = True can_view_details = True page_size = 2 create_modal = True edit_modal = True can_export = True
2. 调整app.py视图注册规则
确保指定表使用普通用户可访问的视图类,其余表保持超级管理员专属:
# 注册视图部分修改为: admin.add_view(CarAdminView(Car, db.session)) # 仅超级管理员可见 admin.add_view(MyModelView(Profile, db.session)) # 仅超级管理员可见 admin.add_view(MyModelView(Username, db.session)) # 仅超级管理员可见 admin.add_view(CarUserView(usertest, db.session)) # 普通用户+超级管理员可见
核心说明
- 通过继承分层实现权限隔离:
MyModelView管控超级管理员专属表,UserAllowedModelView管控普通用户可访问表 - 若需开放更多表给普通用户,只需将对应视图注册改为继承
UserAllowedModelView即可 - 需确保你的用户角色体系中,普通用户已被分配
user角色(基于Flask-Security的角色机制)
内容的提问来源于stack exchange,提问作者Random Stranger
相关产品推荐
相关产品推荐

