DRF模块
Posted kangwy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF模块相关的知识,希望对你有一定的参考价值。
1.DRF请求模块
1.drf的request是在wsgi的request基础上再次封装
2.wsgi的request作为drf的request的一个属相:_request
3.新的request对旧的request做了完全的兼容.
4.新的request对数据解析的更加规范化:所有拼接的参数都解析到query_params中,所有数据包数据都被解析到data中,
5.query_param和data属于QueryDict类型,可以.dict()转化为原生dict类型.
# 源码分析
1.drf的APIView类: 重写了as_vies(),但是主体的逻辑还是调用父类的View的as_view(), 局部禁用的csrf认证
重点:所有继承drf的基本视图类APIVies的视图类,都不在做csrf认证校验.
2.drf的APIView类:重写的dispatch(),在内部对request进行了二次封装:self.initialize_request(request, *args, **kwargs)
内部核心:
走drf的Request初始化方法__init__:self._request=request
drf的Request的__getattr__:先从self._request反射取属性,没有取到再去drf的request方法中取.
核心: request除了可以访问原wsgi协议的request所有内容,还可以访问 query_params,data
2.DRF渲染模块
1.可以在视图类中通过renderer_classes类属性对该视图的数据响应渲染做配置 - 局部配置
2.可以在项目的配置文件的drf配置中通过DEFAULT_RENDERER_CLASSES对该视图的数据响应渲染做配置 - 全局配置
如果一个视图类在有全局配置下,还进行了局部配置,会优先走自己的局部配置
# 源码分析
1.二次处理对象: APIView的dispatch方法 - self.finalize_response(request, response, *args, **kwargs)
2.获取渲染对象: 进入finalize_response方法 -self.perform_content_negotiation(request, force=True)
3.从配置文件中得到渲染类对象: perform_content_negotiation ---self.get_renderers() -> [renderer() for renderer in self.renderer_classes]
核心: 可以全局和局部配置视图类支持的结果渲染: 默认可以json和页面渲染,学习该模块的目的是开发可以全部只配置json方式渲染。
3.DRF解析模块 - 服务的对象是数据包数据
1.可以在视图类中通过parser_classes类属性对该视图的数据包解析做配置 - 局部配置
2.可以在项目中的配置文件的drf配置中通过DEFAULT_PARSER_CLASSES对该视图的数据包解析做配置 - 全局配置
# 源码分析
1.APIView的dispatch方法: self.initialize_request(request, *args, **kwargs),内部还提供了数据解析
2.self.get_parser_context(request)提供要解析的数据, self.get_parsers()提供解析类对象(内部从配置中找解析类)
核心: 请求的数据包格式会有三种(json, urlencoded, form-data), drf默认支持三种数据解析,可以全局或局部配置视图类具体支持的解析方式.
4.DRF异常模块: 重写异常模块目的是记录异常信息
1.在settings的drf配置中配置EXCEPTION_HANDLER, 指向自定义的exception_handler函数
2.drf出现异常了,都会回调exception_handler函数,携带异常对象和异常相关信息内容.
在exception_handler函数完成异常信息的反回以及异常信息的logging日志
# 源码分析
1.在APIView的dispatch方法中,有一个超大的try..except..,将代码运行异常都交给异常处理模块处理self.handle_exception(exc)
2.从配置中映射出配置处理异常函数(自定义异常模块就是自定义配置指向自己的函数) :self.get_exception_handler()
3.异常函数exception_handler(exc,context)处理异常就会走自己的:
先交给系统处理(客服端的异常),系统没有处理(服务端异常), 在自己处理.
核心: 异常信息都需要被logging记录,所以需要自定义,drf只处理客服端异常,服务端异常需要手动处理,统一结果.
5.响应模块
Response类生成对象需要的参数,以及Response类对象可以使用的属性
1.参数: Response(data=响应的数据, status=响应的网络转态码, headlers=想通过响应头在携带部分信息给前端.)
2.属性: response.data response.status_code response.status_text
源码: Response类的__init__方法.
核心: 知道reponse对象产生可以传哪些信息,response对象又是如何访问这些信息的
以上是关于DRF模块的主要内容,如果未能解决你的问题,请参考以下文章