请求响应组件

请求响应组件

请求模块

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: 可以取出来状态码,也可以设置状态码

这两个常用...

原文地址:https://www.cnblogs.com/xiongchao0823/p/11892138.html