请求响应组件
请求模块
drf的request是对wsgi的request的二次封装, 并且完全兼容, 并且拓展了 query_params 和 data 两个属性
这里的完全兼容是因为源码中写的情况是, 把原来的request
改变成_request
,drf自己封装了自己的request,检索的时候如果_request
中找不到就在自己封装的里面去找,所以说完全兼容,并且还得以扩展.
渲染模块
需要在注册app的地方注册一下rest_framework
可以全局和局部配置渲染方式
只允许renderers_classes
中定义的渲染方式
# 局部
from rest_framework.views improt APIView
// 有好多渲染方式
from rest_framework.renderers import JSONRenderer, BrowsableAPIRender, BaseRenderer
class XXX(APIView):
# 这个位置添加局部配置
renderers_classes = [JSONRenderer, BrowsableAPIRender,BaseRenderer]
def xx(self, request, *args, **kwargs):
...
# 全局配置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
# 配置只允许渲染json数据
'rest_framework.renderers.JSONRenderer',
],
}
解析模块
需要在注册app的地方注册一下rest_framework
可以全局和局部配置允许解析的数据包
# 局部
from rest_framework.views improt APIView
// 有好多格式的数据包,这里只列举几个
from rest_framework.parser import JSONParser, BaseParser
class XXX(APIView):
# 这个位置添加局部配置
renderers_classes = [JSONParser,BaseParser]
def xx(self, request, *args, **kwargs):
...
# 全局配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
# 配置只允许接收json数据
'rest_framework.parsers.JSONParser',
],
}
异常模块
需要在注册app的地方注册一下rest_framework
自定义异常模块, 可以自定义异常返回以及把异常记录到日志中,方便在项目上线后进行一些调试,不然错都不知道在哪儿去找
第一步: 创建一个任意名字的py文件,例如: utils.py
第二步: 在py文件中写下面格式的函数, 函数名一定要是这样的
from rest_framework.response import Response
# 导入源码中的exception_handler函数,因为重名,所以定义别名
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
# 名字和源码中的一样(exception_handler)
def exception_handler(exc, context):
# 通过源码我们知道drf_exception_handler处理服务端报错的时候返回值是空
response = drf_exception_handler(exc, context)
if response is None:
# 如果这个为空, 就说明是服务器的500错误
# 这个错误是drf不做处理的
# 我们把错误信息保存到日志文件中
# data: 传递的数据
# status:响应状态码
response = Response(data={'status': '1', 'msg': 'error', 'exc': f'{exc}'},
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
response = Response(data={'status': '1', 'msg': 'error', 'exc': f'{exc}'})
return response
第三步: 因为源码中的exception_handler
方法是只处理客户端的错误,对于服务端的错误是返回空, 所有我们可以对其进行重写.
第四步: 完成了删除代码,我们可以在settings文件中配置告诉drf执行我们重写的exception_handler
方法,配置如下:
REST_FRAMEWORK = {
# 配置异常模块为自己的异常模块
'EXCEPTION_HANDLER': 'api.utils.exception_handler',
}
settings中的配置
我们可以把上面的配置写在一起, 他们就是在REST_FRAMEWORK
中的
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer', # 配置只允许渲染json数据
],
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', # 配置只允许接收json数据
],
# 配置异常模块为自己的异常模块
'EXCEPTION_HANDLER': 'api.utils.exception_handler',
}
响应模块
了解Response
对象产生可以传那些信息, Response
对象又是如何访问这些信息的
# Response源码的需要的参数
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
Response.data: 可以取出来传递的数据,相对的也可以设置传递的数据
Response.status: 可以取出来状态码,也可以设置状态码
这两个常用...