使用Flask从站点地图中排除路线的最佳方法是什么?

时间:2013-08-31 19:44:57

标签: python flask

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

1 个答案:

答案 0 :(得分: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