【问题标题】:Flask-Admin's inaccessible_callback() not working properlyFlask-Admin 无法访问的回调()无法正常工作
【发布时间】:2019-05-24 18:25:54
【问题描述】:

我想控制谁可以访问我的烧瓶应用程序的管理页面。

我一直在尝试覆盖 flask_admin.ModelView 的方法“is_accessible”和“inaccessible_callback”来处理这种情况。

这是我正在创建的 AdminView 类:

class AdminView(ModelView):

    def is_accessible(self):
        return current_user.admin

    def inaccessible_callback(self, name, **kwargs):
        # redirect to login page if user doesn't have access
        return redirect(url_for('auth.login', next=request.url))

和模型:

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    email = db.Column(db.String(120), unique=True)
    password_hash = db.Column(db.String(128))
    admin = db.Column(db.Boolean, default=False)

    def __init__(self, username=None, email=None, password=None):
        self.username = username
        self.email = email
        self.password_hash = password_hash
        self.admin = admin

和 AdminView 初始化:

def init_admin(admin):
    from app.models import User
    admin.add_view(AdminView(User, db.session))

在应用工厂中被调用:

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)

    if test_config is None:
        # load the isntance config, if it exists, when not testing
        app.config.from_object(Config)
    else:
        # load the test config passed in
        app.config.from_object(test_config)

    db.init_app(app)
    migrate = Migrate(app, db)
    login_manager.init_app(app)
    mail.init_app(app)
    bootstrap.init_app(app)

    admin = Admin(app, name='app', template_mode='bootstrap3')


    from app.auth import auth_bp
    app.register_blueprint(auth_bp)

    from app.tables import tables_bp
    app.register_blueprint(tables_bp)

    init_admin(admin)

    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    return app

当我使用将admin 属性设置为True 的用户登录时,它会返回正确的管理页面,并准备好使用用户模型。当我使用具有false admin 属性的用户登录时,它仍然显示管理页面,没有附加用户模型。我宁愿将他们重定向到登录页面,并警告他们被禁止进入该页面。

【问题讨论】:

    标签: python flask flask-admin


    【解决方案1】:

    感谢 youtube 视频,我想出了如何让它工作!

    Flask_Admin Accessibility

    查看它以获得更深入的解释!

    问题是“/admin”页面是由flask_admin.AdminIndexView加载的

    因此我必须创建自己的AdminIndexView 子类,并在初始化Admin() 时将其设置为index_view 参数

    这是更新后的代码: 我在管理文件中添加了一个 MyIndexView 类:

    # ...
    from flask_admin import AdminIndexView
    # ...
    class MyIndexView(AdminIndexView):
        def is_accessible(self):
            return current_user.admin
    
        def inaccessible_callback(self, name, **kwargs):
            # redirect to login page if user doesn't have access
            return redirect(url_for('auth.login', next=request.url))
    

    然后我在我的应用程序工厂中设置index_view 参数

    # ...
    from app.admin import AdminView, MyIndexView
    # ...
    admin = Admin(app, name='app', template_mode='bootstrap3',
                      index_view=MyIndexView())
    # ...
    

    现在完美运行!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2017-11-10
      相关资源
      最近更新 更多