You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:31:17