gpt4 book ai didi

python - Pyramid 遍历 __name__ 匹配 View 名称

转载 作者:太空狗 更新时间:2023-10-30 00:19:12 24 4
gpt4 key购买 nike

在遍历 Pyramid 应用程序中,如何处理具有与 View 名称匹配的 __name__ 的资源?

如果我想访问资源的可调用 View “view”,我会使用如下 URL 路径:/foo/bar/view。它遍历 resource_tree 是这样的:

RootFactory(request) => RootFactory
RootFactory['foo'] => Foo
Foo['bar'] => Bar
Bar['view'] => KeyError

...并且因为它不能遍历过去 Bar & 'view' 被遗留下来,它假定 'view' 是 View 名称,并且与我的可调用 View 匹配

@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__ 和 View 名称之间的冲突检测的情况下处理这个问题?

最佳答案

我最终的解决方案是添加一个任意层的容器资源。

下面是资源的示例结构:

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

问题提到想要生成可调用标题 View 的资源 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)

关于python - Pyramid 遍历 __name__ 匹配 View 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37218572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com