python - Django 中的资源 View

标签 python django rest oop django-views

我是第一次使用 Django(一般来说我也是 Python 新手),并且我一直在努力解决与基于类的 View 相关的某个问题。我来自 PHP 和 Laravel,在那里你可以拥有所谓的“RESTful 资源 Controller ”。

对于每个不熟悉 Laravel 的人来说:这个想法是每个“资源”都有一个 Controller (或用 Django 语言来说是 View )。该 Controller / View 定义了诸如 index()show()create()store() 等方法>、edit() 等。这些 Controller 方法的关联 URL 和 HTTP 方法为 GET/photosGET/photos/1、分别GET/photos/createPOST/photosGET/photos/1/edit(例如,如果您正在处理照片)。在 Laravel 的路由中,您只需声明一行 Route::resource('photos', 'PhotoController') ,这些 URL 就会自动生成。更多信息我引用Laravel's docs .

我真的很喜欢这个模式,我想在 Django 中使用它。

据我了解,Django 并没有真正开箱即用的东西。 Django 确实有基于类的 View ,但它们并不代表资源。相反,您有一个“index()” View (PhotoListView)、一个“show()” View (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 等 URL 的路由> 和 /photos/1/edit 等到正确的类方法。缺点是您将路由放在 View 中(不是执行此操作的正确位置),并且不能以这种方式使用命名模式来引用代码中其他位置的 URL。不过,它最接近 Laravel 中的工作方式。

  • 在 URLconf 中为每个 URL 使用单独的行,例如:

    url(r'^photos$', PhotoView.index) url(r'^照片/(\d+)$', PhotoView.show) url(r'^photos/(\d+)/edit$', PhotoView.edit)

    这样做的好处是命名模式照常工作,并且所有路由都保留在 URLconf 中。但是,我不知道如何在 View 类的实现方面实现这一点(我必须用 @classonlymethod 来装饰每个方法,对吧)。

抱歉,文字墙很长,我很高兴听到您对如何最好地解决这个问题的想法。或者也许我只是疯了,我应该像每个普通的 Django 编码员一样使用基于函数的 View 吗?

最佳答案

根据Jens的建议在评论中。第三方 Django Rest Framework 是我们所描述的与 Laravel Controller 最接近的东西。具体要看的项目是viewsets

Django REST framework allows you to combine the logic for a set of related views in a single class, called a ViewSet. In other frameworks you may also find conceptually similar implementations named something like 'Resources' or 'Controllers'.

DRF 的学习曲线非常陡峭。 DRF 还给人留下了这样的印象:它只适合创建 API。然而,现实情况是 DRF 可用于 render HTML and process ordinary HTML forms .

REST framework is suitable for returning both API style responses, and regular HTML pages. Additionally, serializers can used as HTML forms and rendered in templates.

当然,另一种选择是使用基于类的 View 。缺点是它不能在单个类中提供 DRF View 集的所有功能。但一切并没有失去。您可以使用CBV Mixins混合并匹配您需要的功能。

关于python - Django 中的资源 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40728107/

相关文章:

python - py2app、pycrypto、aes 未找到

python - 使用 PIL 在 Tkinter 中显示动画 GIF

python - 持续处理子进程中的大量 stdout 和 stderr

django - 以编程方式禁用 Django 命令中的 DEBUG

python - django表单queryset多个相同字段过滤器

django - 在 AWS Elastic Beanstalk 上部署 Geodjango 应用程序

Python .get 嵌套 Json 值

python - 从 tweepy 异常实例中获取错误代码

java - Restful Jersey Web 服务可以接受所有类型的资源吗?

node.js - 尝试连接到 API 端点导致无法连接到本地主机