仅在Flask中将页面/ URL限制为Admin

时间:2014-01-20 13:12:54

标签: python flask

在GAE中,将某些网址限制为仅限管理员quite easy

- url: /admin/.*
  script: admin.app
  login: admin

现在我正在使用Flask。我必须在每个仅管理功能中重复相同的代码,以告知用户是否为admin,这使代码冗长冗余。

@app.route('/admin/somepage')
def AdminPage():
   #Figure out if a user is admin

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

您可以使用app.before_request() hook检查请求,并在请求的路径以/admin/开头时使用重定向进行响应,但身份验证信息缺失或不足。

def check_for_admin(*args, **kw):
    if request.path.startswith('/admin/'):
        if not user.is_admin():
            return redirect(url_for('login_form'))

通过返回响应对象(例如before_request从{{1}}处理程序生成的处理程序停止处理,并且不会调用实际视图。

您还可以使用装饰器来标记管理员视图;这更灵活(路由不需要全部在一条路径下)并且更容易被发现(每条路线都有装饰器)。

答案 1 :(得分:0)

你的AdminPage()应该是一个继承自flask_admin BaseView的类,你重写方法is_accessible,如下所示:

from flask_admin import BaseView

class AdminPage(BaseView):
    def is_accessible(self):
        return current_user_is_admin()

    @expose('/', methods=('GET', 'POST'))
    def do_whatever(self):
        # do it
        return self.render("admin/whatever.html")

当然,您的用户类需要有一个方法(在示例中称为current_user_is_admin()),该方法仅在当前用户是管理员时才评估True。无论如何,您都需要获得此信息。

据我所知,这是使用flask_admin的正确方法。您可以通过更改is_accessible()覆盖来为每个管理功能定义复杂或简单的权限规则。