解析器分类:

  1. JSONPaser ----> 解析 JSON-serialized data (解析JSON序列化的数据)

  2.FormParser ---->解析form 表单中 urlencoded格式数据(application/x-ww-form-urlencoded)

  3.MartiPartParser---->解析 form 表单中 form-data 格式数据(Multipart/form-data)

  4.FileUploadParser---> 解析 '*/*',(Parser for file upload data.)

源码中的解析器

  • 展开源码你会发现,每个解析器下面都会定义一个 解析方法(这是一种面向对象的鸭子类型的体现)。

  • 前端传过的数据以及文件,在后端被使用的时候(request.data,request.FILES)时候解析器才执行解析。所以解析器执行的入口是 request.data or request.FILES

源码部分:

# Request-->_parse() 方法
def _parse(self):
"""
Parse the request content, returning a two-tuple of (data, files) May raise an `UnsupportedMediaType`, or `ParseError` exception.
"""
# 获取文本类型
media_type = self.content_type
try:
# 获取 请求body体中的内容
stream = self.stream
except RawPostDataException:
if not hasattr(self._request, '_post'):
raise
# If request.POST has been accessed in middleware, and a method='POST'
# request was made with 'multipart/form-data', then the request stream
# will already have been exhausted.
if self._supports_form_parsing():
return (self._request.POST, self._request.FILES)
stream = None if stream is None or media_type is None:
if media_type and is_form_media_type(media_type):
empty_data = QueryDict('', encoding=self._request._encoding)
else:
empty_data = {}
empty_files = MultiValueDict()
return (empty_data, empty_files)
# 选择 解析器 返回解析器对象
parser = self.negotiator.select_parser(self, self.parsers)
# 如果没有解析器就报错
if not parser:
raise exceptions.UnsupportedMediaType(media_type) try:
# parser 是已选择的解析器对象(有 JSONparser,Formparser,MultiPartParser,FileUploadParser 是种 ,每个对象里都有一个 parse 方法,用于解析数据或文件。(这里是一种面向对象的鸭子类型的体现))
# 返回解析完的parsed对象
parsed = parser.parse(stream, media_type, self.parser_context)
except Exception:
# If we get an exception during parsing, fill in empty data and
# re-raise. Ensures we don't simply repeat the error when
# attempting to render the browsable renderer response, or when
# logging the request or similar.
self._data = QueryDict('', encoding=self._request._encoding)
self._files = MultiValueDict()
self._full_data = self._data
raise # Parser classes may return the raw data, or a
# DataAndFiles object. Unpack the result as required.
try:
# 最终返回 parsed对象的数据和文件
return (parsed.data, parsed.files)
except AttributeError:
empty_files = MultiValueDict()
return (parsed, empty_files)

  

执行流程(以JSON 格式数据为例)

"""
-->1.request.data
-->2.执行request.data 中的 self._load_data_and_files()
-->3.执行self._load_data_and_files() 中的 self._data, self._files = self._parse()
-->4. 执行self._parse()
-->4.1.执行stream = self.stream-->self._load_stream() 获取请求内容
-->4.2 执行parser = self.negotiator.select_parser(self, self.parsers)获取解析器
-->4.2.1 执行 self.negotiator = negotiator or self._default_negotiator()
--> 如果没有传 就去 配置文件中找api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS()
-->4.3 执行 parsed = parser.parse(stream, media_type, self.parser_context) 返回通过不同解析器解析出来的被解析对象
-->4.4 返回
"""

最新文章

  1. Android -- 自定义控件(ImageButton)
  2. Array数组标准库
  3. 如何禁用IE10的明文显示密码和快速清除功能
  4. CRM JS 设置lookup字段 setSimpleLookupValue
  5. 设置ShowDialog
  6. _margin和margin的区别
  7. Handling HTTP 404 Error in ASP.NET Web API
  8. Python IDLE 清屏工具
  9. Swift语法基础入门二(数组, 字典, 字符串)
  10. HDU1176:免费馅饼(DP)
  11. jQuery 完成ajax传jsonObject数据,并在后台处理
  12. [转]Oracle left join \ right join
  13. hibernate介绍及环境搭建
  14. DATASNAP远程方法返回TSTREAM正解
  15. 换抵挡装置 (Kickdown,ACM/ICPC NEERC 2006,UVa1588
  16. Linux vi/vim使用方法
  17. cf- 297 < b > -- 区间翻转操作的优化
  18. Kali部署openvas初探与实践
  19. Windows7 配置匿名Samba文件共享
  20. Mysql信息数据库:Information_schema

热门文章

  1. C++各大有名库的介绍——网络通信
  2. NOIP2019翻车前写(and 抄)过的代码
  3. Softmax与Sigmoid函数的联系
  4. ASP.NET Core的无状态身份认证框架IdentityServer4
  5. 【C++】一个指针占几个字节?为什么呢?
  6. Linux时间日期类,压缩和解压类
  7. 关于FMX 单击出来右键菜单,并显示在当前下面
  8. npm是干什么的(转)
  9. Java学习:数组工具类Arrays
  10. win7系统 右击任务栏 资源管理器 弹出菜单“已固定”和“最近”项目不显示故障处理