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