Python中Flask框架有什么好的权限管理机制插件,类似Django-Admin?

最好是拥有:用户,角色,权限

回复请说明你选择的理由,或者优缺点


Python中Flask框架有什么好的权限管理机制插件,类似Django-Admin?
15 回复

django-admin 不是权限管理只是后台啊


Flask本身没有像Django-Admin那样内置的、开箱即用的全功能管理后台。不过,有几个非常成熟的插件可以帮你构建强大的权限管理系统,核心是Flask-AdminFlask-Security-Too的组合。

1. Flask-Admin (核心管理界面) 这是最接近Django-Admin的插件。它提供了现成的Model视图,能快速为你的SQLAlchemy、Peewee等ORM模型生成增删改查的后台管理页面。但它主要是个“管理面板生成器”,不直接处理用户认证和细粒度权限。

2. Flask-Security-Too (认证与授权核心) 这是Flask-Security的活跃维护分支,是处理权限的“大脑”。它基于Flask-Login、Werkzeug等,提供了:

  • 用户认证:注册、登录、注销、忘记密码。
  • 角色(Role)和权限(Permission)模型:这是关键。你可以定义角色(如admin, user, moderator),并为角色分配权限(如user-read, post-delete)。
  • 装饰器保护视图:用@roles_required('admin')@permissions_required('post-delete')来保护路由。

经典组合方案:Flask-Admin + Flask-Security-Too 这是社区公认的最佳实践之一。用Flask-Security-Too管理用户、角色和权限逻辑,然后让Flask-Admin集成这个权限系统来控制后台访问。

代码示例:一个简单的集成

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin, AdminIndexView
from flask_admin.contrib.sqla import ModelView
from flask_security import Security, SQLAlchemyUserDatastore, RoleMixin, UserMixin, login_required

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'

db = SQLAlchemy(app)

# 1. 定义数据模型 (Flask-Security-Too)
roles_users = db.Table('roles_users',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

# 2. 设置Flask-Security-Too
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

# 3. 自定义受保护的Admin视图
class ProtectedModelView(ModelView):
    def is_accessible(self):
        # 只有具有'admin'角色的用户才能访问
        from flask_login import current_user
        return current_user.is_authenticated and current_user.has_role('admin')

    def inaccessible_callback(self, name, **kwargs):
        # 无权限则重定向到登录页
        return redirect(url_for('security.login'))

class ProtectedAdminIndexView(AdminIndexView):
    def is_accessible(self):
        from flask_login import current_user
        return current_user.is_authenticated and current_user.has_role('admin')

# 4. 创建Admin并使用受保护的视图
admin = Admin(app, index_view=ProtectedAdminIndexView())
admin.add_view(ProtectedModelView(User, db.session))
admin.add_view(ProtectedModelView(Role, db.session))

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

这个例子创建了一个基础应用。ProtectedModelView确保了只有admin角色的用户能看到并操作Flask-Admin里的用户和角色管理页面。

其他值得考虑的插件

  • Flask-Principal:提供了更细粒度的身份和权限需求,适合复杂场景,但上手稍难。
  • Flask-Login:如果你只需要基础的会话管理和“登录状态”,可以用它作为底层,但复杂权限需要自己实现。

总结建议 对于大多数需要类Django-Admin权限管理的项目,Flask-Admin + Flask-Security-Too这个组合是稳定、高效的选择。

没说清,类似与 django-admin 后台带的权限管理机制

flask-admin

目前不需要后台,只需要权限管理

推荐 Flask-Security

#5 这个库的作者已经好久没更新了吧,而且它的代码实现基本也是不太行。

自己建个权限表用不了十分钟啊

造轮子不止 10 分钟啊

#6 去年更新过吧? github 还在开发啊

flask-security

姑且认为你很久没用了

你们真的看清楚了真的是原作者在更新吗?而且,除了大家的小修小补之外真的有新功能加上?

没有特别好用的,flask_admin 也不行,flask-security 的用法我是觉得挺不适应的,最后还是自己造轮子

回到顶部