有没有办法检查当前请求路径的所有子路径是否都有视图可调用?

1 投票
1 回答
725 浏览
提问于 2025-04-17 13:46

我正在制作一个面包屑导航生成器。这个生成器会使用请求的路径,然后针对每一个子路径,构建一个面包屑。

举个例子:

/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字典中查找路径前缀了。

撰写回答