我正在尝试在 RESTful API 中为 PUT
请求创建 Pyramid 路由,以创建新资源。我的应用程序使用遍历,这对于 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/路径1/路径2/new_resource
最佳答案
此堆栈溢出问题:Pyramid traversal HTTP PUT to a URI that doesn't exist提出了一种创建不同的 NewResource 上下文类型来表示新资源的解决方案。如果找不到所请求的子项,Resource 类的 __getitem__()
方法可以始终返回 NewResource。然后,可以为 NewResource 上下文和 PUT
request_method 设置 View 配置。
这几乎可行,除了在未找到子项时始终返回 NewResource 而不是引发 KeyError
时,它破坏了使用命名 View 作为 URL 从属的能力。例如,如果以下情况,URL:/resources/path1/path2/my_view
将错误地返回 my_view
的 NewResource 上下文,而不是将其用作 view_name它存在。
到目前为止,我发现的解决此问题的最佳方法是创建一个自定义 Pyramid 遍历算法,该算法首先使用默认遍历算法,但如果失败,它会检查 request.method
是否为放置
。如果是,则返回 NewResource 的上下文,否则按原样返回遍历结果。
关于rest - PUT 请求的 Pyramid 遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34443073/