【问题标题】:How can you dispatch on request method in Django URLpatterns?如何在 Django URLpatterns 中发送请求方法?
【发布时间】:2011-02-27 04:55:11
【问题描述】:

很清楚如何创建从 URL 正则表达式调度的 URLPattern:

(r'^books/$', books),

书籍可以根据要求进一步分派的方法:

def books(request):
    if request.method == 'POST':
        ...
    else:
        ...

我想知道是否有一种惯用的方式将请求方法包含在 URLPattern 中,将所有调度/路由信息保存在一个位置,例如:

(r'^books/$', GET, retrieve-book),
(r'^books/$', POST, update-books),
(r'^books/$', PUT, create-books),

【问题讨论】:

    标签: python django django-urls


    【解决方案1】:

    它作为单一视图方法完成的原因是您通常将某种页面内容呈现为您将要提交的表单的上下文。

    无论如何,我回复它的原因是:从您的示例 URLConf 看起来您正在使用 Django 构建一个 REST Web 服务——如果是这种情况,您可能会真正受益于使用相当好的 django-piston 来自动创建您的资源/收藏。它使用基于类的处理程序,根据请求中的 HTTP 方法自动重定向到适当的方法(在您的情况下为 get-books、update-books、create-books)

    更新(四年后!)虽然 django-piston 仍然存在(并且有效),但 Django REST Framework 现在是一个更加复杂、记录和扩展的选择。

    【讨论】:

    • PS - 不想开始一场面包大战,但我认为 POST 应该转到“创建”,而 PUT 应该根据 HTTP 1.1 规范转到“更新”(这是也是在 django-piston 中做事的方式)
    • 假设我明白什么是“包子大战”(从字面上看听起来很有趣),一些非常有道理的包子被扔在这里:stackoverflow.com/questions/630453/put-vs-post-in-rest
    【解决方案2】:

    除了您在第二个 sn-p 中使用的之外,标准 Django 没有任何区分请求方法的机制:

    if request.method == 'POST':
        ...
    

    但是,有第三方应用程序和 sn-ps 尝试使用基于类的视图使方法处理更简洁。例如,参见this snippet(来自this SO question about class views)。

    我个人不太确定这是一个好主意。标准的 Django 方法是如此……标准……我认为这会在真正不需要的地方引入额外的混乱和复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-03
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多