【发布时间】:2017-04-05 07:35:54
【问题描述】:
我是第一次使用 Django(我也是 Python 的新手),一段时间以来我一直在努力解决与基于类的视图相关的某个问题。我来自使用 Laravel 的 PHP,在那里你可以拥有所谓的“RESTful 资源控制器”。
对于不熟悉 Laravel 的每个人:这个想法是每个“资源”都有一个控制器(或 Django 中的视图)。这个控制器/视图定义了诸如index()、show()、create()、store()、edit()等方法。这些控制器方法的关联url和HTTP方法是GET /photos、GET /photos/1、@分别为 987654332@、POST /photos、GET /photos/1/edit(例如,如果您正在处理照片)。在 Laravel 的路由中,你只需要声明一行 Route::resource('photos', 'PhotoController') 并且这些 URL 会自动生成。更多信息,我参考Laravel's docs。
我真的很喜欢这种模式,我想在 Django 中使用它。
据我了解,Django 并没有开箱即用的东西。 Django 确实有基于类的视图,但它们并不代表资源。相反,您有一个“index()”视图 (PhotoListView),一个“show()”视图 (PhotoDetailView) 等等。
我不确定我应该如何在 Django 中实现这种模式,我什至不确定我想要的是不是一个好主意。
经过研究,我发现了一些可能有用的信息:
http://watchitlater.com/blog/2010/02/django-restful-resources/
https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/
我不确定第一个链接中的自定义 View 类能实现普通 Django View 无法做到的(普通的 Django View 或多或少做同样的事情,对吧?),我不认为第二个链接正是我想要的(如果我理解正确,这篇文章只是描述了一个中间件,作为 Django 没有将通过 DELETE/PUT 请求发送的数据放入请求中的问题的解决方案)。
基于此,我设计了两种可能的解决方案:
-
在 URLconf 中使用一行来匹配某个资源的所有 URL,如下所示:
url(r'^photos/(.*)$', PhotoView.as_view())然后,自定义 View 基类的
as_view()函数将处理诸如/photos、/photos/1和/photos/1/edit等 URL 到正确类方法的路由。缺点是您将路由放在视图中(不是这样做的正确位置),并且您不能以这种方式使用命名模式来引用代码中其他地方的 URL。不过,它最接近它在 Laravel 中的工作方式。 -
在 URLconf 中为每个 URL 使用单独的行,例如:
url(r'^photos$', PhotoView.index) url(r'^photos/(\d+)$', PhotoView.show) url(r'^photos/(\d+)/edit$', PhotoView.edit)这样做的好处是命名模式照常工作,所有路由都保留在 URLconf 中。但是,我不知道如何在 View 类的实现方面实现这一点(我必须装饰每个方法@classonlymethod,对吧)。
对不起,文字墙,我很高兴听到你关于如何最好地解决这个问题的想法。或者也许我只是疯了,我应该像每个普通的 Django 编码器一样使用基于函数的视图吗?
【问题讨论】:
-
@JensAstrup 是的,我(多次)偶然发现了这一点。我不是在构建 API,而是在构建网站/webapp。
标签: python django rest oop django-views