在Django URLpatterns中如何根据请求方法进行分发?

15

如何创建一个从 URL 正则表达式分发的 URLPattern 是很清楚的:

(r'^books/$', 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),
2个回答

8
这个方法被设计成单一视图方法的原因是,通常您需要渲染某种页面内容作为表单提交的上下文。
无论如何,我回复的原因是:从您的样例URLConf中看来,您正在使用Django构建REST webservice - 如果是这种情况,您可能会受益于使用相当不错的django-piston自动创建您的资源/集合。它使用基于类的处理程序,根据请求中的HTTP方法自动重定向到适当的方法(在您的情况下为get-books、update-books、create-books)。
更新(四年后!)虽然django-piston仍然存在(并且可用),但Django REST Framework现在是一个更加复杂、有文档和扩展的选择。

4
根据HTTP 1.1规范(并且这也是Django-piston中的做法),在我看来,POST应该归为“create”,而PUT应该归为“update”。请注意,我不想引起争执。 - Steve Jalim
假设我理解什么是“包子大战”(字面上听起来很有趣),这里正在投掷一些相当有理的包子:https://dev59.com/HHRB5IYBdhLWcg3wa2q2 - Michael Scheper

1

标准的Django没有除了您在第二个片段中使用的方法之外区分请求方法的机制:

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

然而,有第三方应用程序和代码片段尝试使用基于类的视图使方法处理更加清晰。例如,请参见this snippet(从this SO question about class views中找到)。

个人而言,我不确定这是否是一个好主意。标准的Django方法如此...标准...我认为这引入了额外的混乱和复杂性,实际上并不需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接