如何在Django URL模式中按请求方法进行分发?

15 投票
2 回答
4573 浏览
提问于 2025-04-15 23:29

我们可以很清楚地看到,如何创建一个URL模式,它是通过一个URL的正则表达式来进行分发的:

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

在这里,books 还可以根据请求的方法进一步进行分发:

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

我想知道有没有一种比较常见的方式,可以把请求的方法也包含在这个URL模式里,这样所有的分发和路由信息都能放在一个地方,比如:

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

2 个回答

1

标准的Django并没有提供区分请求方法的机制,除了你在第二段代码中使用的方式:

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

不过,有一些第三方的应用和代码片段,试图通过基于类的视图来让处理请求方法的过程变得更简单。例如,可以看看这个代码片段(这个链接来自于关于类视图的这个问题)。

不过我个人觉得这未必是个好主意。标准的Django方法是非常...标准的...我认为引入这些额外的东西只会增加不必要的困惑和复杂性。

8

之所以用单个视图方法来处理,是因为你通常是在为即将提交的表单渲染一些页面内容。

不过,我回复的原因是:从你提供的URL配置来看,你似乎是在用Django构建一个REST网络服务——如果真是这样的话,使用一个叫做 django-piston 的工具会对你很有帮助,它可以自动创建你的资源和集合。这个工具使用基于类的处理器,可以根据请求中的HTTP方法自动跳转到相应的方法(比如获取书籍、更新书籍、创建书籍等)。

更新(四年后!)虽然django-piston仍然存在(并且可以使用),但现在 Django REST Framework 是一个更高级、更有文档支持和扩展性的选择。

撰写回答