有没有办法检查当前请求路径的所有子路径是否都有视图可调用?
我正在制作一个面包屑导航生成器。这个生成器会使用请求的路径,然后针对每一个子路径,构建一个面包屑。
举个例子:
/blog/articles/view/12345
接下来,对于每一个子路径:
/blog/articles/view
/blog/articles
/blog
如果这个网址后面有一个可以调用的视图(允许不带参数的GET请求),那么就返回True;否则返回False。
这样我就可以让面包屑中的子路径变成可点击的,这样用户就知道那里有内容可以查看。
有没有什么办法可以在不调用任何子路径的情况下,生成这些面包屑,以避免产生无用的代码执行呢?
1 个回答
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
字典中查找路径前缀了。