我正在研究面包屑发生器。 它使用request.path然后,为每个子路径构建一个痕迹。
示例:
/blog/articles/view/12345
然后对每个子路径:
/blog/articles/view
/blog/articles
/blog
如果在此URL后面有一个可调用的视图(允许不带参数的GET方法),则返回True,否则返回False
这样我就可以使面包屑中的子路径可以点击,以显示那里提供的东西。
任何不会调用任何子路径并产生无用的代码执行的想法?
答案 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
词典中查找路径前缀。