【问题标题】:How to add your own decorator to the flask-admin panel?如何将自己的装饰器添加到烧瓶管理面板?
【发布时间】:2021-06-04 19:48:54
【问题描述】:

我正在使用 Flask-Login 进行登录处理。此外,我为自己编写了一个装饰器,以保持仅对角色=管理员可见的视图。

def admin_required(f):
    @wraps(f)
    def wrap(*args, **kwargs):
        if current_user.role.name == "admin":
            return f(*args, **kwargs)
        else:
            flash("You need to be an admin to view this page.")
            return redirect(url_for('home'))
    return wrap

我可以将那个装饰器用于我的路线。但我不知道如何在我的烧瓶管理面板中使用这个装饰器。

Flask-SQLAlchemy 模型已添加到 flask-admin 视图中,例如:

from flask_admin.contrib.sqla import ModelView
from flask_admin import Admin

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

admin.add_view(ModelView(User, db.session))
admin.add_view(ModelView(Role, db.session))

但我希望如果不是管理员的人点击:127.0.0.1:8000/admin 无法访问并被重定向到 /home。

但是我的 /admin 没有路由,当我实现一个时,我不知道应该返回什么 html?

谢谢

【问题讨论】:

  • 看看这个,flask admin 很好地支持基于角色的访问flask-admin.readthedocs.io/en/latest/introduction/…
  • 为什么不直接为 /admin 创建一个路由?为什么你没有管理员的路线?我已经通过将自定义管理装饰器放在我的管理路由上方来处理这个问题。然后,如果他们尝试访问该路由(基于您的装饰器功能),他们将被重定向到“家”

标签: python flask flask-sqlalchemy flask-admin


【解决方案1】:

使用内置方法is_accessible,默认返回True,这意味着管理面板将被所有人访问,你可以通过覆盖它来改变它:

class MyAdminViews(ModelView):

    def is_accessible(self):
        user = User.query.filter_by(role=current_user.role).first()
        res = user.role == "admin"
        return res

admin.add_view((MyAdminViews(User, db.session)))
admin.add_view((MyAdminViews(Post, db.session)))

现在,当且仅当用户拥有管理员角色时,才能访问这些管理员视图。此外,您可能希望添加一个子句以使其仅在有人登录时才可访问,否则浏览器将引发内部服务器错误。你可以这样做:

class MyAdminViews(ModelView):
    def is_accessible(self):
        if current_user.is_authenticated:
            user = User.query.filter_by(role=current_user.role).first()
            res = user.role == "admin"
            return res

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2015-09-14
    • 2012-07-14
    • 2019-11-13
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多