0

获取用于构建站点地图的所有路线的列表很简单,例如 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
4

1 回答 1

0

您可以修改您的装饰器以在“未映射”列表中注册目标函数。然后,您可以从大的路线列表中减去该列表。

例如:

def auth_role(roles):
    def _auth_role_required(f):
        @wraps(f)

        # add to not_mapped list
        register_not_mapped(f.__name__)

        def _inner(*args, **kwargs):
            # ...
        return _inner
    return _auth_role_required
于 2013-09-02T02:39:41.963 回答