文章目录
一、请求对象(Request Object)
DRF传入视图的request对象不再是Django默认的HttpRequest对象,而是DRF提供的扩展后的request对象。Request对象的核心功能是request.data属性,它与request.POST类似,但对于使用Web API更为有用。
request.POST # 只处理表单数据 只适用于'POST'方法
request.data # 处理任意数据 适用于'POST','PUT'和'PATCH'方法
常用属性
-
data
:request.data
返回解析之后的请求体数据。类似于Django中的request.POST
和request.FILES
属性,但提供如下特性:- 包含了解析之后的文件和非文件数据;
- 包含了对POST、PUT、PATCH请求方式解析后的数据;
- 利用了DRF的parsers解析器,不仅支持表单类型数据,也支持JSON数据。
-
query_params
:request.query_params
与Django标准的request.GET
相同,只是更换了更正确的名称而已。因为任何HTTP方法类型都可能包括查询参数,而不仅仅是GET请求。
二、响应对象(Response Object)
REST框架还引入了一个Response对象,这是一种TemplateResponse
类型,它接受未呈现的内容,并使用内容协商来确定返回给客户端的正确内容类型。
return Response(data) # 根据客户端请求类型渲染内容
2.1 常用属性
-
data
:Response未渲染的序列化数据。
-
status_code
:HTTP响应的数字状态码。
-
content
:渲染好的响应内容,但必须先调用
render()
方法,才能访问content
。
2.2 自定义Response对象
from rest_framework.response import Response
class CustomResponse(Response):
# 比父类多了code和msg两个实例属性
def __init__(self, code=1000, msg="成功", data=None, status=None, template_name=None, headers=None, content_type=None, **kwargs):
custom_data = {'code':code, 'msg': msg}
if data:
custom_data = {'code':code, 'msg': msg, 'data':data}
custom_data.update(kwargs)
super().__init__(data=custom_data, status=status, template_name=template_name, headers=headers, content_type=content_type)
"""
使用时,就要返回CustomResponse类的对象了
return CustomResponse(data={'name':'hugh'},……)
"""
三、状态码(Status codes)
在视图中使用纯数字的状态码,会导致可读性很差,并且容易忽视掉错误或警告。DRF对每一个状态码提供了更加清楚、直观的标识符,其本质是一些常量,将纯数字的状态码保存了起来而已。比如HTTP_400_BAD_REQUEST
,保存的就是数字400。
3.1 使用方法
虽然实现简单,但使用这些标识符(常量)的确可以使代码更加清晰、易读。比如:
from rest_framework import status
from rest_framework.response import Response
def empty_view(self):
content = {'请求的资源不存在'}
return Response(content, status=status.HTTP_404_NOT_FOUND)
这些标识符(常量)仅仅是加了HTTP前缀和一些状态关键字后缀。只要我们知道要使用哪个状态码,就可以通过IDE的自动补全打出完整名称,无需去逐个了解😄。
3.2 辅助函数
rest_framework.status
模块还包括一组辅助函数,用于测试状态代码是否在给定范围内。
完整的函数列表如下:
is_informational(status.HTTP_404_NOT_FOUND) # 判断是否在1~199之间,返回布尔值,下面的以此类推
is_success() # 2xx
is_redirect() # 3xx
is_client_error() # 4xx
is_server_error() # 5xx
四、配置默认Response渲染器
4.1 全局配置
在项目配置文件settings.py中:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
]
}
4.2 局部配置
在需要配置的视图中:
from rest_framework.renderers import JSONRenderer
from rest_framework.views import APIView
class AView(APIView):
renderer_classes = [JSONRenderer]
def get(self, request):
……
4.3 渲染器类
-
JSONRenderer:
使用utf-8编码将数据呈现为
JSON
,该渲染器是默认启用的。media_type:
application/json
。 -
TemplateHTMLRenderer:
使用Django的标准模板渲染将数据渲染到HTML中,传递给Response的数据不需要序列化,但可能需要
template_name
参数。media_type:
text/html
。 -
BrowsableAPIRenderer:
将数据渲染成可浏览的API,也就是通过浏览器打开时默认的样子,所以,该渲染器是默认启用的。
media_type:
text/html
。渲染器类种类繁多,但不常用。感兴趣可以参考官方文档:传送门