rest - PUT 请求的 Pyramid 遍历

标签 rest pyramid traversal restful-url

我正在尝试在 RESTful API 中为 PUT 请求创建 Pyramid 路由,以创建新资源。我的应用程序使用遍历,这对于 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/路径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_viewNewResource 上下文,而不是将其用作 view_name它存在。

到目前为止,我发现的解决此问题的最佳方法是创建一个自定义 Pyramid 遍历算法,该算法首先使用默认遍历算法,但如果失败,它会检查 request.method 是否为放置。如果是,则返回 NewResource 的上下文,否则按原样返回遍历结果。

关于rest - PUT 请求的 Pyramid 遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34443073/

相关文章:

REST 网络服务 API : upload/update report template

java - Angular 2 将文件上传到 Java Api

python - Pyramid 架构迁移

optimization - 在 Clojure 中,我可以优化扫描吗?

spring - Jersey ExceptionMapper 不映射异常

ios - iOS 客户端/服务器应用程序

python - 如何使用 Pyramid 和烧杯的 cookie session 来正确存储 session_id?

python - Pyramids 认证系统有多灵活?

java - AVL 树中序遍历不起作用

c# .net xpath 遍历时不挑选元素