如何在Django URL模式中按请求方法进行分发?
我们可以很清楚地看到,如何创建一个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 是一个更高级、更有文档支持和扩展性的选择。