概述

在DRF中,引入了一个Request和Response对象进行请求和响应,这两个对象分别继承于Djaong中常规的HttpRequest和SimpleTemplateResponse,相比其父类,它们提供了更灵活的请求解析和响应内容。

1.Request

Request类继承于Django中常规的HttpRequest,相比HttpRequest增加了灵活的请求解析和请求认证的支持。

1.1.解析请求(Request Parsing)

REST框架中提供了多种用于解析request的类,如JSONParser,FormParser等等,Request对象可以像处理form数据一样处理JSON数据和其他媒体类型的数据。经常我们会将请求解析为JSON数据的形式进行响应。

DRF默认使用了JSONParser类进行解析,因此我们在返回JSON数据时不需要做任何工作,当然DRF中还提供了其他解析类,可在配置文件中进行配置(不过貌似没这个必要):

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
)
}

Request中和请求解析相关的属性有以下三个:

request.data

request.data是Request对象的核心属性,它会返回请求体中所有的解析内容。能够处理任何数据,如文件和表单数据并且对适用于POST、PUT、PATCH方式请求。

request.query_params

该属性会返回请求体中的查询参数,如假设通过GET方式请求http://127.0.0.1:8000/show/?name=zhangsan,则request.query_params为:

{ "name": "zhangsan" }

NOTE: 不仅仅是GET请求,其他请求方式也可能会带有查询参数。

request.parsers

该属性会返回当前解析类的list,如果用户通过parser_classes设置,则读取设置值,如果用户没有设置,则读取默认值DEFAULT_PARSER_CLASSES的值,可在请求时print(request.parsers)查看该属性值:

[
<rest_framework.parsers.JSONParser object at 0x05D61E70>,
<rest_framework.parsers.FormParser object at 0x05D7F8F0>,
<rest_framework.parsers.MultiPartParser object at 0x05D7F950>
]

1.2.身份验证(Authentication)

DRF中提供了按请求进行认证的机制,且有如下特点:

  • 1 .对API的不同部分使用不同的认证策略;
  • 2.支持多种身份验证策略;
  • 3.对每个请求提供了用户和token信息。

关于身份验证和权限认证会在之后的文章中进行总结,这里只看Request中和身份验证相关的几个属性。

request.user

该属性返回请求的用户,如果请求经过身份验证,则返回django.contrib.auth.models.User;如果未经过身份验证,则返回django.contrib.auth.models.AnonymousUser.

request.auth

该属性值返回身份验证上下文,它取决于所使用的身份验证策略,但一般在request.auth中带有Token,如果请求未经过身份验证,则该值为None.

request.authenticators
该属性值返回身份验证的list,如果用户设置,则读取authentication_classes的值,如果没有设置,则读取默认值DEFAULT_AUTHENTICATORS的值,可在请求时通过print(request.authenticators)查看该属性值:

[
<rest_framework.authentication.SessionAuthentication object at 0x05850950>,
<rest_framework.authentication.BasicAuthentication object at 0x05850970>
]

2.Response

Response类继承于Django的SimpleTemplateResponse,相比于HttpResponse和它的父类,Response只是提供了一个更好的界面,用于返回内容协商的Web API响应,可以呈现为多种格式。因此对于后端开发人员来说,很方便进行API的测试。如在浏览器进行请求时,界面就是Response提供的:

Response对象的创建

和HttpResponse对象相比,Response不需要通过实例化Render进行渲染,而是直接传入未渲染的数据。由于Response的渲染器无法处理复杂类型的数据,如Django中的Model实例,因此,需要在响应之前通过Serializer类进行序列化操作,将复杂类型序列化为Python原始数据类型。

Response使用时需要进行导入:

from rest_framework.response import Response

其构造方法如下:

Response(data, status=None)

data

响应给客户端的序列化后的数据

status

响应状态码,默认为200.

在DRF中对每个响应码都提供了更明确的标识符,接下来我们将对这个响应码标识符进行总结。

3.状态码(Status Code)

REST框架中提供了一些表示状态码的标识符,相比起数字,可以更容易在代码设计过程中理解,使用时需要导入其所在模块:

from rest_framework import status

分为5大类:

Informational - 1xx

HTTP_100_CONTINUE # 目前为止的所有内容都是正常的,并且客户端应该继续请求或者如果它已经完成则忽略它
HTTP_101_SWITCHING_PROTOCOLS # 服务器正在根据发送包括Upgrade请求头的消息的客户端的请求切换到的协议

Successful - 2xx

HTTP_200_OK # 请求已成功。200响应默认是可缓存的
HTTP_201_CREATED # 请求已成功并导致创建资源
HTTP_202_ACCEPTED # 该请求已被接收但尚未起作用
HTTP_203_NON_AUTHORITATIVE_INFORMATION # 请求已成功,但封装的有效负载已由源服务器的200(OK)响应由变换代理修改
HTTP_204_NO_CONTENT # 请求已成功,但客户端无需离开其当前页面
HTTP_205_RESET_CONTENT # 响应状态通知客户端重置文档视图,例如清除表单内容,重置画布状态或刷新 UI
HTTP_206_PARTIAL_CONTENT # 成功状态响应代码指示请求已成功并且主体包含所请求的数据范围,如Range请求标题中所述
HTTP_207_MULTI_STATUS # 由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码

Redirection - 3xx

HTTP_300_MULTIPLE_CHOICES # 重定向状态响应代码指示该请求具有多个可能的响应
HTTP_301_MOVED_PERMANENTLY # 重定向状态响应代码指示所请求的资源已明确移动到Location标题给定的URL 
HTTP_302_FOUND # 重定向状态响应代码指示所请求的资源已暂时移动到由Location标题给定的 URL
HTTP_303_SEE_OTHER # 重定向状态响应代码(通常作为一个 PUT或POST操作的结果发回)表示重定向不链接到新上载的资源,而是链接到其他页面,如确认页面或上载进度页面
HTTP_304_NOT_MODIFIED # 客户端重定向响应代码指示不需要重新传输请求的资源
HTTP_305_USE_PROXY # 被请求的资源必须通过指定的代理才能被访问
HTTP_307_TEMPORARY_REDIRECT # 重定向状态响应代码指示所请求的资源已暂时移动到由Location标题给定的 URL 
HTTP_308_Permanent_Redirect # 重定向状态响应代码指示所请求的资源已明确移动到Location标题给定的 URL

Client Error - 4xx

HTTP_400_BAD_REQUEST # 服务器无法理解请求
HTTP_401_UNAUTHORIZED # 客户端错误状态响应代码指示该请求尚未应用,因为它缺少目标资源的有效认证凭证
HTTP_402_PAYMENT_REQUIRED
HTTP_403_FORBIDDEN # 客户端错误状态响应代码指示服务器理解请求但拒绝授权
HTTP_404_NOT_FOUND # 客户端错误响应代码指示服务器找不到请求的资源
HTTP_405_Method_Not_Allowed # 服务器已知请求方法,但已被禁用且无法使用

Server Error - 5xx

HTTP_500_INTERNAL_SERVER_ERROR # 服务器遇到阻止它履行请求的意外情况
HTTP_501_NOT_IMPLEMENTED # 请求方法不受服务器支持并且无法处理
HTTP_502_BAD_GATEWAY # 服务器充当网关或代理时收到来自上游服务器的无效响应
HTTP_503_SERVICE_UNAVAILABLE # 服务器尚未准备好处理请求
HTTP_504_GATEWAY_TIMEOUT # 服务器充当网关或代理时无法及时得到响应
HTTP_505_HTTP_VERSION_NOT_SUPPORTED # 服务器不支持请求中使用的 HTTP 版本。
HTTP_507_INSUFFICIENT_STORAGE # 服务器无法存储完成请求所必须的内容
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED # 客户端需要进行身份验证才能获得网络访问权限

二,Request和Response的更多相关文章

  1. Request和Response对象

    Request 和 Response 对象起到了服务器与客户机之间的信息传递作用.Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏 ...

  2. 【转】request和response的页面跳转传参

    下面是一位园友的文章: jsp或Servlet都会用到页面跳转,可以用 request.getRequestDispatcher("p3.jsp").forward(request ...

  3. javaweb学习总结二十五(response对象的用法一)

    一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:r ...

  4. ASP.NET中的Request、Response、Server对象

    Request对象 Response.Write(Request.ApplicationPath) //应用根路径 Request.AppRelativeCurrentExecutionFilePat ...

  5. JavaWeb(一)Servlet中的request与response

    一.HttpServletRequest概述 1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP ...

  6. 第十五节:HttpContext五大核心对象的使用(Request、Response、Application、Server、Session)

    一. 基本认识 1. 简介:HttpContext用于保持单个用户.单个请求的数据,并且数据只在该请求期间保持: 也可以用于保持需要在不同的HttpModules和HttpHandlers之间传递的值 ...

  7. 简单了解request与response

    本文对 request. response 简单描述,未涉及到具体的浏览器缓存.重定向.请求转发等代码部分. 一.Web服务器,浏览器,代理服务器 在看 response.request 对象之前,先 ...

  8. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  9. java web(三):ServletContext、session、ServletConfig、request、response对象

    上一篇讲了Servlet: 1)什么是Servlet[servlet本身就是一种Java类,这种Java类提供了web形式的方法,只要实现了servlet接口的类,都是一种servlet资源.] 2) ...

随机推荐

  1. RabbitMQ install (Ubuntu)

    1. key 1) Online way apt-key adv --keyserver "hkps.pool.sks-keyservers.net" --recv-keys &q ...

  2. Css实战第二天小结

    清除浮动的四种方式: 1.1    给父盒子设置一个高度: 1.2    Clear:both; 1.3    Overflow:hidden; 1.4    使用伪元素 .clearfix:befo ...

  3. 小众Python库介绍

    Python 是世界上发展最快的编程语言之一.它一次又一次地证明了自己在开发人员和跨行业的数据科学中的实用性.Python 及其机器学习库的整个生态系统使全世界的用户(无论新手或老手)都愿意选择它.P ...

  4. [TJOI2015]弦论(后缀自动机)

    /* 一道在树上乱搞的题目 建立出parent树来, 然后就能搞出每个节点往后能扩展出几个串, 至于位置不同算同一个的话就强制让right集合大小为1即可 然后在树上类比权值线段树找第k大26分统计一 ...

  5. 添加删除mysql用户

    create user 'hive_user'@'%' identified by '密码'; grant all privileges on hive.* to hive_user@'%'; cre ...

  6. Python 3.6 -win64环境安装PIL模块

    PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修 ...

  7. Ubantu下安装jdk 教程

    ubuntu 安装jdk 的两种方式: 这篇帖子,有些地方,写的有点问题.我只能按照记忆中的印象,修改一下. 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通 ...

  8. tomcat和eclipse-wtp的一些配置

    TOMCAT配置UTF-8 server.xml配置文件: <Connector port="8080" protocol="HTTP/1.1" conn ...

  9. error:hadoop 中没有etc目录

    download binary 而不是 source http://hadoop.apache.org/#Download+Hadoop

  10. UVA-10020-贪心

    题意:给你一些数轴上的线段,要求寻找出某些线段能够完全覆盖[0,M],并且取的线段数目最小. 解题思路: 贪心思路, 1.每个线段都有一个L和R,代表它的起点和终点,对于所有R <= 0 ,   ...