获取用于构建站点地图的所有路线的列表很简单,例如 rules = current_app.url_map.iter_rules()
. 但是我的应用程序中的一些路由是用于管理功能的,这些应该从站点地图中排除(包括 XML 和人类可读的)。所有这样的管理路由都有一个装饰器@auth_role(...)
(如下所示,它与http://flask.pocoo.org/docs/patterns/viewdecorators/@login_required
中描述的装饰器非常相似)。URL 没有将它们与其他非管理 URL 区分开来的特殊段。所以我希望能够过滤路由以排除那些指向视图函数的也有@auth_role(...)
装饰师。这样做有意义吗?如果是这样,如何做到这一点?如果不是,我是否应该修改所有管理路线以包括一些将它们与公共消费路线分开的部分?
def auth_role(roles):
def _auth_role_required(f):
@wraps(f)
def _inner(*args, **kwargs):
try:
if g.user is None:
flash(u'You must login to access the requested resource.', CSS.ERR)
path = urlsplit(request.url).path
if path in ['', '/', '/admin']:
return redirect('/admin/login')
else:
return redirect('/admin/login?d=%s' % path)
if not g.user.is_active():
flash(u'Your account is no longer active.', CSS.ERR)
return abort(403)
if not g.user.is_authorized(roles):
flash(u'Your current role does not grant access to this resource.', CSS.ERR)
return abort(403)
except KeyError:
return abort(401)
return f(*args, **kwargs)
return _inner
return _auth_role_required