.get、.post 等方法处理程序与 .list、.create 等操作之间有什么区别

What is the difference between method handlers such .get, .post and actions such as .list, .create

我正在学习 Django Rest Framework,我注意到的一件事是视图集提供了诸如 .list、.post 之类的操作,而不是诸如 .get、.post 之类的方法处理程序这又是由视图提供的。文档说动作比方法处理程序更灵活,但我似乎找不到任何原因。您能否分享一些有关为什么 Viewsets 使用操作而不是方法处理程序的信息?

GET 和 POST 是处理表单时唯一使用的 HTTP 方法。

Django 的登录表单使用 POST 方法返回,浏览器将表单数据打包,编码传输,发送到服务器,然后接收响应。

GET,相比之下,将提交的数据打包成一个字符串,并用它来组成一个URL。 URL 包含必须发送数据的地址,以及数据键和值。如果您在 Django 文档中进行搜索,您可以看到实际效果,它将生成 https://docs.djangoproject.com/search/?q=forms&release=1.

形式的 URL

GET 和 POST 通常用于不同的目的。

任何可用于更改系统状态的请求 - 例如,在数据库中进行更改的请求 - 应使用 POST。 GET 应该只用于不影响系统状态的请求。

GET 也不适合密码形式,因为密码会出现在 URL 中,因此也会出现在浏览器历史记录和服务器日志中,全部以纯文本形式出现。它既不适合大量数据,也不适合二进制数据,例如图像。对管理表单使用 GET 请求的 Web 应用程序存在安全风险:攻击者很容易模仿表单的请求来访问系统的敏感部分。 POST,再加上 Django 的 CSRF 保护等其他保护措施,可以更好地控制访问。

另一方面,GET 适用于网络搜索表单之类的东西,因为代表 GET 请求的 URL 可以很容易地添加书签、共享或重新提交。

.get() 和 .post() 等请求处理程序基于 http 请求方法,而 .create() 或 .list() 等操作是从功能角度出发的。假设您有一个视图 class 可以按用户 ID return 单个用户的信息或按排序顺序 return 所有用户。这两个请求都是来自客户端的GET请求,只是参数和目的不同。如果您只想在这种情况下使用 .get() 处理程序,则需要定义两个视图函数并在 url 配置中注册两个 url。或者您可以使用 ViewSet class 或带有具有动作函数 .list() 和 .retrieve() 的混合的通用视图来处理这些请求,然后使用路由器 class 来设置 url 配置遵循 REST url 标准。