金字塔遍历 __name__ 匹配视图名称
Pyramid Traversal __name__ matching a view name
在遍历金字塔应用程序中,如何处理具有与视图名称匹配的 __name__
的资源?
如果我想访问资源的可调用视图 "view",我会使用 URL 路径,例如:/foo/bar/view
。它遍历 resource_tree 是这样的:
RootFactory(request) => RootFactory
RootFactory['foo'] => Foo
Foo['bar'] => Bar
Bar['view'] => KeyError
...并且因为它无法遍历 Bar & 'view' 被遗留下来,它假设 'view' 是视图名称,并且与我的视图 callable[=24= 相匹配]
@view_config(name='view')
def view(context, request):
return Response(context.__name__)
要获得该路径的 URL,我将使用 request.resource_url(resource, "view"
).
但是,如果我有 Bar.__name__ = "view"
这样的资源,我如何在 Foo 上为 "view" 解析 URL?
# path: /foo/view
RootFactory(request) => RootFactory
RootFactory['foo'] => Foo # ideally stop here with view_name="view"
Foo['view'] => Bar.__name__ = "view"
# all parts of path matched so view_name="" and context=Bar
理想情况下,在这种情况下,/foo/view
将指向 view(Foo, request)
,而 /foo/view/view
将指向 view(Bar, request)
,其中 Bar.__name__ == "view"
.
有没有办法在不编写 __name__
和视图名称之间的冲突检测的情况下处理这个问题?
我最终的解决方案是添加任意层的容器资源。
下面是资源的示例结构:
class Foo(object):
def __init__(self, parent, name):
self.__parent__ = parent
self.__name__ = name
def __getitem__(self, key):
if key == "bar":
return BarContainer(self, "bar")
else:
raise KeyError()
class BarContainer(object):
def __init__(self, parent, name):
self.__parent__ = parent
self.__name__ = name
def __getitem__(self, key):
return Bar(self, key)
class Bar(object):
def __init__(self, parent, name):
self.__parent__ = parent
self.__name__ = name
问题提到想要为视图可调用标题视图生成资源 URL。使用 BarContainer
这只是添加了一个额外的斜杠:
/{foo}/bar/{bar}/<view_name>
/a/view => view(context=Foo(name='a'), request)
/a/bar/view => view(context=BarContainer(name='bar'), request)
/a/bar/b/view => view(context=Bar(name='b'), request)
在遍历金字塔应用程序中,如何处理具有与视图名称匹配的 __name__
的资源?
如果我想访问资源的可调用视图 "view",我会使用 URL 路径,例如:/foo/bar/view
。它遍历 resource_tree 是这样的:
RootFactory(request) => RootFactory
RootFactory['foo'] => Foo
Foo['bar'] => Bar
Bar['view'] => KeyError
...并且因为它无法遍历 Bar & 'view' 被遗留下来,它假设 'view' 是视图名称,并且与我的视图 callable[=24= 相匹配]
@view_config(name='view')
def view(context, request):
return Response(context.__name__)
要获得该路径的 URL,我将使用 request.resource_url(resource, "view"
).
但是,如果我有 Bar.__name__ = "view"
这样的资源,我如何在 Foo 上为 "view" 解析 URL?
# path: /foo/view
RootFactory(request) => RootFactory
RootFactory['foo'] => Foo # ideally stop here with view_name="view"
Foo['view'] => Bar.__name__ = "view"
# all parts of path matched so view_name="" and context=Bar
理想情况下,在这种情况下,/foo/view
将指向 view(Foo, request)
,而 /foo/view/view
将指向 view(Bar, request)
,其中 Bar.__name__ == "view"
.
有没有办法在不编写 __name__
和视图名称之间的冲突检测的情况下处理这个问题?
我最终的解决方案是添加任意层的容器资源。
下面是资源的示例结构:
class Foo(object):
def __init__(self, parent, name):
self.__parent__ = parent
self.__name__ = name
def __getitem__(self, key):
if key == "bar":
return BarContainer(self, "bar")
else:
raise KeyError()
class BarContainer(object):
def __init__(self, parent, name):
self.__parent__ = parent
self.__name__ = name
def __getitem__(self, key):
return Bar(self, key)
class Bar(object):
def __init__(self, parent, name):
self.__parent__ = parent
self.__name__ = name
问题提到想要为视图可调用标题视图生成资源 URL。使用 BarContainer
这只是添加了一个额外的斜杠:
/{foo}/bar/{bar}/<view_name>
/a/view => view(context=Foo(name='a'), request)
/a/bar/view => view(context=BarContainer(name='bar'), request)
/a/bar/b/view => view(context=Bar(name='b'), request)