【问题标题】:Pyramid traversal for PUT requestsPUT 请求的金字塔遍历
【发布时间】:2015-12-23 20:17:47
【问题描述】:

我正在尝试在 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/path1/path2/new_resource

【问题讨论】:

    标签: rest pyramid traversal restful-url


    【解决方案1】:

    这个 Stack Overflow 问题:Pyramid traversal HTTP PUT to a URI that doesn't exist 提出了一种解决方案来创建不同的 NewResource 上下文类型来表示新资源。 Resource 类的__getitem__() 方法如果找不到请求的子对象,则总是可以返回一个NewResource。然后,可以为 NewResource 上下文和PUT request_method 设置视图配置。

    这几乎可行,除了在找不到孩子时总是返回 NewResource 而不是提高 KeyError 它破坏了使用命名视图作为 URL 下属的能力。例如,URL:/resources/path1/path2/my_view 会错误地为my_view 返回一个 NewResource 上下文,而不是将其用作 view_name(如果存在)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2021-03-21
      相关资源
      最近更新 更多