PUT请求的金字塔遍历
Pyramid traversal for PUT requests
我正在尝试为 RESTful API 中的 PUT
请求创建金字塔路由,以创建新资源。我的应用程序使用遍历,这对 GET
和 POST
:
非常有用
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.
的结果
我正在尝试为 RESTful API 中的 PUT
请求创建金字塔路由,以创建新资源。我的应用程序使用遍历,这对 GET
和 POST
:
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.