.get,.post之类的方法处理程序与.list,.create之类的操作之间有什么区别?

时间:2019-07-16 16:43:47

标签: django-rest-framework django-rest-viewsets

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

2 个答案:

答案 0 :(得分:0)

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

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

相比之下,

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适用于诸如Web搜索表单之类的内容,因为代表GET请求的URL可以轻松地添加书签,共享或重新提交。

答案 1 :(得分:0)

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