Python 这是一种检查当前request.path的所有子路径是否都具有与关联的可调用视图的方法吗?

Python 这是一种检查当前request.path的所有子路径是否都具有与关联的可调用视图的方法吗?,python,pyramid,Python,Pyramid,我在做面包屑发生器。 它使用request.path,然后为每个子路径构建一个面包屑 例如: /blog/articles/view/12345 然后,对于每个子路径: /blog/articles/view /blog/articles /blog 如果此URL后面有一个可调用的视图(允许GET方法不带参数),则返回True,否则返回False 这样我就可以点击面包屑中的子路径来显示那里有服务 任何不会调用任何子路径并生成无用代码执行的想法?不,您必须测试所有路径前缀;路由允许许多任意UR

我在做面包屑发生器。 它使用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

现在,您可以在
现有\u视图
字典中查找路径前缀。

否,您必须测试所有路径前缀;路由允许许多任意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

您现在可以在
现有的\u视图中查找路径前缀。

因此,我看到,有人投了反对票,这很公平,但没有任何解释,这绝对没有任何帮助。可能是因为您没有共享一点代码来显示您所做的尝试。@Tshepang:在这种情况下,这实际上并不简单,我不认为否决票是应得的。所以,我明白了,有人做了否决票,很公平,但没有任何解释,这绝对没有任何帮助。可能是因为你没有分享一点代码来展示你的尝试。@Tshepang:在这种情况下,这其实并不简单,我认为否决票是应得的。太棒了,Martijn!我用request.Blank()和DummyRequests进行了测试,它们对每个视图执行真正的http请求,而404没有。让我测试一下,完成测试后我会验证答案。@AnthonyPerot Rajan:这就是为什么重用
PViewsCommand
类要好得多的原因;它确实为您创建了一个虚拟请求,但注意不要实际调用视图!我用request.Blank()和DummyRequests进行了测试,它们对每个视图执行真正的http请求,而404没有。让我测试一下,完成测试后我会验证答案。@AnthonyPerot Rajan:这就是为什么重用
PViewsCommand
类要好得多的原因;它确实为您创建了一个虚拟请求,但注意不要实际调用视图。