在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
有没有更好的方法呢?
答案 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()覆盖来为每个管理功能定义复杂或简单的权限规则。