概述
在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
Successful - 2xx
HTTP_200_OK HTTP_201_CREATED HTTP_202_ACCEPTED HTTP_203_NON_AUTHORITATIVE_INFORMATION HTTP_204_NO_CONTENT HTTP_205_RESET_CONTENT HTTP_206_PARTIAL_CONTENT HTTP_207_MULTI_STATUS
Redirection - 3xx
HTTP_300_MULTIPLE_CHOICES HTTP_301_MOVED_PERMANENTLY HTTP_302_FOUND HTTP_303_SEE_OTHER HTTP_304_NOT_MODIFIED HTTP_305_USE_PROXY HTTP_306_RESERVED HTTP_307_TEMPORARY_REDIRECT
Client Error - 4xx
HTTP_400_BAD_REQUEST HTTP_401_UNAUTHORIZED HTTP_402_PAYMENT_REQUIRED HTTP_403_FORBIDDEN HTTP_404_NOT_FOUND
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_507_INSUFFICIENT_STORAGE HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
原文地址:https://www.cnblogs.com/yoyo1216/p/10444106.html