解析过程?
前端请求的数据格式
例如Json
解析成Python才能用。
本质是对请求体中的数据进行解析。
解析原理?
使用请求头中的Accept和ContentType
Accept是告诉对方我能解析什么格式的数据
ContentType是告诉对方我给你的是什么样的数据类型
拿到请求的ContentType,根据ContentType找相应的解析器进行解析
Django解析器与DRF解析器的区别?
Django解析后的数据在request.GET和request.POST中
Django的request是WSGIRequest类的对象 (from django.core.handlers.wsgi import WSGIRequest )
WSGIRequest 类的POST属性(类似于
@property
def POST()
request.POST --> _get_post
request.POST=xx --> _set_post
):
WSGIRequest 类的_get_post方法
可以看出,Django不能解析Json格式的数据。
通过request.GET和request.POST能解析的是' multipart/form-data '和' application/x-www-form-urlencoded '
DRF的request是进一步封装的Request类对象,解析后数据在request.data中
Request类的属性方法def data:
Request类的方法_load_data_and_files:
经过4步解析数据,然后返回parsed.data和parsed.files
上面的第3步 self.negotiator在实例化的时候传参了
self.parsers也一样,在配置文件中
APIView的initialize_request方法
APIView的get_content_negotiator方法
从配置文件中获取
DRF默认配置:
接下来看select_parser方法:
每个解析器类都有media_type,指定该解析器能解析的数据类型
参数parers同样在初始化传参了:self.get_parsers
APIView的get_parsers方法
解析器在配置文件中:
DRF默认配置的解析类,默认的解析器没有 ' rest_framework.parsers.FileUploadParser ' ,有需要可以加上
第四步:使用找到的parser解析数据,parser类中必须实现parse方法
DRF所有的解析器在: from rest_framework import parsers