它是一种检查当前request.path的所有子路径是否都具有与之关联的视图的方法?

时间:2013-01-26 21:05:06

标签: python pyramid

我正在研究面包屑发生器。 它使用request.path然后,为每个子路径构建一个痕迹。

示例:

/blog/articles/view/12345

然后对每个子路径:

/blog/articles/view
/blog/articles
/blog

如果在此URL后面有一个可调用的视图(允许不带参数的GET方法),则返回True,否则返回False

这样我就可以使面包屑中的子路径可以点击,以显示那里提供的东西。

任何不会调用任何子路径并产生无用的代码执行的想法?

1 个答案:

答案 0 :(得分:1)

不,你必须测试所有路径前缀;路由允许可以使用许多任意URL。此外,对于混合中的路径谓词,多个路由可以匹配相同的URL,并且它们之间的选择取决于请求中的其他信息。

准备你的面包屑,而不是遍历子路径一次,并确定是否有匹配的视图;最简单的方法是重用pviews命令底层的代码;此代码需要当前请求:

from pyramid.scripts.pviews import PViewsCommand

pvcomm = PViewsCommand()

urlpath = request.environ['PATH_INFO']
parts = urlpath.split('/')
existing_views = {}

for i in range(1, len(parts)):
    path = '/'.join(parts[:i])
    view = pvcomm._find_view(path, request.registry)
    if view is not None:
        existing_views[path] = view

您现在可以在existing_views词典中查找路径前缀。