解析过程?
前端请求的数据格式
例如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

 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号