什么是解析器
  • 因为前后端分离,可能有json、xml、html等各种不同格式的内容
  • 后端也必须要有一个解析器来解析前端发送过来的数据
  • 不然后端无法处理前端数据
  • 后端有一个渲染器Render,和解析器是相反方向,将后端数据翻译成前端能明白的数据格式
 
 
Django原生的解析器
  • Django原生的解析器对于post的数据,如果要从request.body中解析出来放到request.POST中
  • 必须满足两个条件
 
REST框架的解析器
  • REST框架提供了很多内置的Parser类,用来处理各种媒体类型的请求,比如json、xml,还支持自定义解析器
  • BaseParser:解析器基类,以下四个类都直接继承他
  • JSONParser
  • FormParser
  • MultiPartParser
  • FileUploadParser
 
解析器源码解析
"""
BaseParser解析器基类源码
相当于是留了一个坑,被继承后重写
定义了空的 midia_type 媒体类型
定义了parse方法以及对应参数
"""
class BaseParser:
media_type = None
def parse(self, stream, media_type=None, parser_context=None):
# 没有实现实现这个方法的异常,没有写任何代码
raise NotImplementedError(".parse() must be overridden.")
'''
JSONParser解析器源码
继承BaseParser
''' class JSONParser(BaseParser):
media_type = 'application/json' # 定义媒体类型
renderer_class = renderers.JSONRenderer #渲染器,解析是解析json那么返回也应该渲染json返回
strict = api_settings.STRICT_JSON # 限制设置 def parse(self, stream, media_type=None, parser_context=None):
# 如果有解析上下文,将parser_context赋值parser_context,否则赋值一个空字典
parser_context = parser_context or {}
# 上下文如果有编码方式,赋值给encoding,否则使用默认的编码格式
encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) try:
#对数据流进行读取和编码的处理
decoded_stream = codecs.getreader(encoding)(stream)
#验证是否符合约束
parse_constant = json.strict_constant if self.strict else None
# 返回解码之后的数据流
return json.load(decoded_stream, parse_constant=parse_constant)
except ValueError as exc:
raise ParseError('JSON parse error - %s' % str(exc)) '''
其他解析器大同小异
'''
 
解析器触发及相关参数配置
  • DRF将有效的解析器集定义为类的列表。当 request.data 被访问时,REST框架将检查请求头的 Content-Type 属性
  • 以此来确定要使用哪个解析器来解析数据。
  • 解析器只有在请求request.data的时候才会被调用!如果不需要data数据,那么就不用解析
  • 在Django项目的settings.py文件中 DEFAULT_PARSER_CLASSES 进行全局的解析器设置

# 默认的解析器配置
# 几种解析器的写法没有先后顺序的要求,不像中间件那样的配置有顺序关系
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES':(
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
)
} '''
如果我们配置第三方解析器 ,例如yml等
解析器和渲染器都需要配置,一般是配对使用的
配置格式:app.file.calss
'''
 
视图级别解析器
单独指定的优先级高于全局的解析器配置,单独指定什么,就只能用什么解析器
 
# 类属性指定
class TestApi(APIView):
# 通过parser_classes指定该视图的解析器,值是一个元组or list
parser_classes = (JSONParser,)
def post(self, request):
return Response('xxx')
 
#函数装饰器指定
from rest_framework.decorators import parser_classes
@api_view(['POST'])
@parser_classes((JSONParser,))
def testApi(request):
...
 
 
自定义解析器
要自定义解析器,必须继承 BaseParser 类
设置 .media_type 属性
实现parse(self, stream, media_type, parser_context) 方法
该方法应返回将用于填充 request.data 属性的数据
 
#示例-文本解析器
class TextParser(BaseParser):
media_type = 'text/plain' #媒体类型
def parse(self, stream, media_type=None, parser_context=None):
return stream.read() #返回读取的内容
解析器区别
解析器区别
JSONParser
解析 JSON 格式的请求内容
其.media_type属性值为 application/json
FormParser
解析HTML表单内容,使用QueryDict的数据填充request.data
这也是Django原生支持的解析方式。
通常同时支持FormParser和MultiPartParser两种解析器,以便完全支持HTML表单数据。
.media_type: application/x-www-form-urlencoded
MultiPartParser
解析多部分的HTML表单内容,支持文件上传
.media_type: multipart/form-data HTML的form表单的enctype属性规定了form表单在发送数据到服务器时的编码方式

三种方式:
application/x-www-form-urlencoded
默认的编码方式,常用于键值对数据
但是在用文本的传输和MP3等大型文件的时候,使用这种编码效率低下 multipart/form-data
指定传输数据为二进制类型,比如图片、mp3、文件 text/plain
纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。使用较少
FileUploadParser
解析原始文件上传内容。此时, request.data 属性将是一个字典,并且只包含一个键'file' ,对应的值包含上传的文件内容。
如果使用FileUploadParser解析器的视图,在被调用的时候URL中携带一个 filename 关键字参数
则该参数将被用作文件名。如果在没有这个关键字参数的情况下调用它,则客户端必须在
HTTP头部的 Content-Disposition 中设置文件名。例如 Content-Disposition:attachment; filename=upload.jpg
.media_type: */*
FileUploadParser 用于原生的文件上传请求。对于在浏览器中上传或者使用带有分段上传功能的客户端使用MultiPartParser 解析器
由于 FileUploadParser 的 media_type 属性值是 */* ,表示可以接受所有内容类型,所以无需指定别的解析器,指定 FileUploadParser 就足够了。
 

28.解析器Parser的更多相关文章

  1. Django-rest-framework 接口实现 分页:(Pagination) 解析器(Parser) 渲染器(renderer)

    分页:(Pagination) rest_framework 中已经定义好了 3 种 分页模式 from rest_framework.pagination import PageNumberPagi ...

  2. easyui的解析器Parser

    平时使用easyui做框架开发时,都知道easyui的模块组件能通过属性方法或js方法来渲染,本质上是通过parser解析器来处理实现的,因为多数情况下都是自动触发完成整个页面的解析,所以没有感觉到它 ...

  3. 通过pull解析器操作安卓的xml

    通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: =================== ...

  4. rest framework的框架实现之 (版本,解析器,序列化,分页)

    一版本 版本实现根据访问的的方式有以下几种 a : https://127.0.0.1:8000/users?version=v1  ---->基于url的get方式 #settings.pyR ...

  5. 黎活明8天快速掌握android视频教程--15_采用Pull解析器解析和生成XML内容

    1.该项目主要有下面的两个作用 (1)将xml文件解析成对象的List对象,xml文件可以来自手机本地,也可以来自服务器返回的xml数据 (2)强list对象保存成xml文件,xml保存到手机的内存卡 ...

  6. 【P4语言学习】Parser解析器

    参考文章:王垠:谈谈Parser 簡單介紹 P4 語言(一)- Parser 什么是Parser 传统的parser,一般出现在编译器和编译原理课程中,援引<谈谈Parser>的定义: 首 ...

  7. [LeetCode] Mini Parser 迷你解析器

    Given a nested list of integers represented as a string, implement a parser to deserialize it. Each ...

  8. EasyUI基础入门之Parser(解析器)

    前言 JQuery EasyUI提供的组件包含功能强大的DataGrid,TreeGrid.面板.下拉组合等.用户能够组合使用这些组件,也能够单独使用当中一个.(使用的形式是以插件的方式提供的) Ea ...

  9. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

随机推荐

  1. Apache DolphinScheduler ASF 孵化器毕业一周年,汇报来了!

    不知不觉,Apache DolphinScheduler 已经从 Apache 软件基金会(以下简称 ASF)孵化器毕业一年啦! 北京时间 2021 年 4 月 9 日,ASF 官方宣布 Apache ...

  2. Apache SeaTunnel (Incubating) 2.1.0 发布,内核重构、全面支持 Flink

    2021 年 12 月 9 日,SeaTunnel (原名 Waterdrop) 成功加入 Apache 孵化器,进入孵化器后,SeaTunnel 社区花费了大量时间来梳理整个项目的外部依赖以确保整个 ...

  3. Node.js + Express + Knex 开发 API 接口

    安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...

  4. 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting). 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我 ...

  5. React报错之You provided a `checked` prop to a form field

    正文从这开始~ 总览 当我们在多选框上设置了checked 属性,却没有onChange 处理函数时,会产生"You provided a checked prop to a form fi ...

  6. 简单创建一个SpringCloud2021.0.3项目(三)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...

  7. SQL order by 语句对null值排序

    记order by 语句对null值排序: 目录 记order by 语句对null值排序: MySQL: Oracle: SqlServer: MySQL: 将null值放在最后 select * ...

  8. KingbaseES R6集群归档备份故障分析解决案例

    案例说明: 在使用ps工具查看主库进程,发现主库'archiver'进程失败,检查sys_log日志可以发现归档失败的信息.通过sys_log日志提取归档语句手工执行归档操作,提示"当前数据 ...

  9. python的环境,你再也不用愁-conda

    Conda Guide Conda简介 conda是一个包,依赖和环境管理工具,适用于多种语言,如: Python, R, Scala, Java, Javascript, C/ C++, FORTR ...

  10. C++ 调用 Python(通过Boost.Python)

    本文将用一个小的示例来展示如何通过Boost.Python 来实现 C++/Python 混合编程从而将两种语言的优势整合到一起. 1. CMakeLists.txt cmake_minimum_re ...