[Django] Django REST Framework(二):Request和Response

概述

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

1.Request

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

1.1.解析请求(Request Parsing)

REST框架中提供了多种用于解析request的类,如JSONParserFormParser等等,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)查看该属性值:

[
0x05D61E70>, 
0x05D7F8F0>, 
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)查看该属性值:

[
0x05850950>, 
0x05850970>
]

2.Response

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

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

你可能感兴趣的:(Django,REST,Framework)