PUT请求的金字塔遍历

Pyramid traversal for PUT requests

我正在尝试为 RESTful API 中的 PUT 请求创建金字塔路由,以创建新资源。我的应用程序使用遍历,这对 GETPOST:

非常有用
config.add_route('myroute', '/resources/*traverse')

因为 PUT 应该在 URL 中有新的资源名称,这显然不适用于 PUT 因为最后有一个未知资源所以遍历失败。我尝试使用混合 URL 分派和遍历方法为 PUT 创建一条新路线:

config.add_route('myroute_put', '/resources/{path}/{new}', traverse='/{path}', request_method='PUT')

当且仅当只有路径段要遍历时,这才有效。新资源的名称可用 request.matchdict['new'] 如果我们在根级别,没有什么可遍历的,我们仍然可以通过创建辅助路由来实现它:

config.add_route('myroute_put_root', '/resources/{new}', reqeust_method='PUT')

然而,这不是一个真正的解决方案,因为如果有多个路径段需要遍历,myroute_put 仍然不匹配,例如 URL:/resources/path1/path2/new_resource

这个 Stack Overflow 问题: 提出了一个解决方案来创建不同的 NewResource 上下文类型来表示新资源。 Resource class 的 __getitem__() 方法总是可以 return 一个 NewResource 如果它不能找到请求的 child。然后,可以为 NewResource 上下文和 PUT request_method 设置视图配置。

这几乎可以工作,除非在找不到 child 时总是 returning a NewResource 而不是提高 KeyError 它打破了将命名视图用作 URL 下属的能力。例如 URL: /resources/path1/path2/my_view 会错误地 return NewResource 上下文 my_view 而不是将其用作 view_name 如果存在的话。

到目前为止,我发现这个问题的最佳解决方法是创建一个自定义金字塔遍历算法,该算法首先使用默认遍历算法,但如果失败,它会检查 request.method 是否为 PUT.如果是这样,那么它 return 是 NewResource 的上下文,否则它 return 是遍历 as-is.

的结果