Python中rapidjson参数校验实现


Posted in Python onJuly 25, 2021

前言

在使用Django框架开发前后端分离的项目时,通常需要对前端传递过来的参数进行校验,校验的方式有多种,可以使用drf进行校验,也可以使用json进行校验,本文介绍在Python中rapidjson的基本使用以及如何进行参数校验。

rapidjson简介和安装

rapidjson是一个性能非常好的C++ JSON解析器和序列化库,它被包装成了Python3的扩展包,就是说在Python3中可以使用rapidjson进行数据的序列化和反序列化操作并且可以对参数进行校验,非常方便好用。

rapidjson安装命令:pip install python-rapidjson

rapidjson基本使用

rapidjson和json模块在基本使用方法上一致的,只不过rapidjson在某些参数方面和json模块不兼容,这些参数并不常用,这里不做过多介绍,详情可参照rapidjson官方文档。基本使用介绍两个序列化的方法dump/dumps,反序列化的load/loads使用json模块的即可。

dumps & dump这两个方法都是将Python实例对象序列化为JSON格式的字符串,用法和参数大致相同,dump方法比dumps方法多了一个必要的file_like参数。

dumps() 方法

该方法返回的结果是一个Python 字符串实例。参数非常多,这里只介绍经常使用的三个参数。

rapidjson.dumps(obj, *, skipkeys=False, ensure_ascii=True, write_mode=WM_COMPACT, indent=4, default=None, sort_keys=False, number_mode=None, datetime_mode=None, uuid_mode=None, bytes_mode=BM_UTF8, iterable_mode=IM_ANY_ITERABLE, mapping_mode=MM_ANY_MAPPING, allow_nan=True)

skipkeys

该参数表示是否跳过不可用的字典的key进行序列化,如果默认为False,如果修改为True字典的key如果不属于基本数据类型(str int float bool None)之一就会跳过该key而不会抛出TypeError的异常。

import rapidjson
from pprint import pprint

dic = {
    True: False,
    (0,): 'python'
}
res = rapidjson.dumps(dic)
pprint(res)  # TypeError: {True: False, (0,): 'python'} is not JSON serializable

res = rapidjson.dumps(dic, skipkeys=True)
pprint(res)  # '{}'

ensure_ascii

该参数表示序列化的结果是否只包含ASCII字符,默认值是True,将Python实例序列化后所有的非ASCII码的字符都会被转义,如果将该参数的值修改为False,增会将字符原样输出。

dic = {
    'name': '丽丽',
    'name1': 'lili'
}
res = rapidjson.dumps(dic)
pprint(res)   # '{"name":"\\u4E3D\\u4E3D","name1":"lili"}'

res = rapidjson.dumps(dic, ensure_ascii=False)
pprint(res)  # '{"name":"丽丽","name1":"lili"}'

sort_keys

该参数表示序列化时是否将字典的key按照字母进行排序。默认是False,如果修改为True,字典序列化得到的结果就是按照字典的key的字母顺序进行排序的。

dic = {
    'name': '丽丽',
    'age': '10'
}
res = rapidjson.dumps(dic, ensure_ascii=False, sort_keys=True)
pprint(res)  # '{"age":"10","name":"丽丽"}'

dump()方法

该方法和dumps方法非常类似,不同的是该方法需要一个额外的必须的参数 - 一个file-like的可写流式对象,比如文件对象,将第一个参数obj进行序列化写入可写的流式对象中。

rapidjson.dump(obj, stream, *, skipkeys=False, ensure_ascii=True, write_mode=WM_COMPACT, indent=4, default=None, sort_keys=False, number_mode=None, datetime_mode=None, uuid_mode=None, bytes_mode=BM_UTF8, iterable_mode=IM_ANY_ITERABLE, mapping_mode=MM_ANY_MAPPING, chunk_size=65536, allow_nan=True)

下面是该方法的基本使用:

# 写入文件
dic = {
    'name': '丽丽',
    'age': '10'
}
f = open('1.py', 'w', encoding='utf8')
res = rapidjson.dump(dic, f)
pprint(res)

# 或者下面这种用法
import io

stream = io.BytesIO()
dump('bar', stream)
print(stream.getvalue())  # b'"bar"'

Validator class

rapidjson中的Validator类可以用来做参数校验。Validator的参数是JSON schema,当我们需要知道JSON数据中预期的字段以及值的表示方式时,这就是JSON Schema的用武之地,是描述JSON数据结构的一种声明格式,也可以通俗的理解为是参数的校验规则。如果JSON schema是不可用的JSON格式的数据,就会抛出JSONDecodeError的异常。

类的参数就是校验规则,如果给定的JSON数据没有通过校验就会抛出ValidationError异常,异常包括三个部分,分别是错误的类型、校验的规则以及在JSON字符串中错误出现的位置。

import rapidjson
from pprint import pprint

validate = rapidjson.Validator('{"required": ["a", "b"]}')  # 表示a和b这两个参数是必须的
validate('{"a": null, "b": 1}')  # 符合规则
validate('{"a": null, "c": false}')  # rapidjson.ValidationError: ('required', '#', '#')
validate = rapidjson.Validator('{"type": "array",'  # 参数类型是array
                     ' "items": {"type": "string"},'  # array中的每个元素类型是string
                     ' "minItems": 1}')  # array中元素数量最少为1

validate('["foo", "bar"]')  # 符合规则
validate('[]')  #  rapidjson.ValidationError: ('minItems', '#', '#')

关于JSON schema的更多参数校验规则以及定义规范可以参考*JSON schema官方文档*,下述是一种JSON schema格式仅供参考:

LOGIN_SCHEMA = {
    "type": "object",
    "properties": {
        "token": "string",
        "number": "integer"
    },
    "required": ["token"],
}   
}

validate = rapidjson.Validator(rapidjson.dumps(LOGIN_SCHEMA))
data = {
    'token': 'python',
    'number': 10
}
validate(rapidjson.dumps(data))

到此这篇关于Python中rapidjson参数校验实现的文章就介绍到这了,更多相关Python rapidjson参数校验内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python统计列表中的重复项出现的次数的方法
Aug 18 Python
Python从零开始创建区块链
Mar 06 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
Python函数装饰器实现方法详解
Dec 22 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
Python基于mediainfo批量重命名图片文件
Dec 29 Python
python用opencv 图像傅里叶变换
Jan 04 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
理解python中装饰器的作用
Jul 21 #Python
opencv检测动态物体的实现
Python爬虫中urllib3与urllib的区别是什么
python Django框架快速入门教程(后台管理)
Python编写nmap扫描工具
Jul 21 #Python
Django模型层实现多表关系创建和多表操作
Jul 21 #Python
Python基本数据类型之字符串str
Jul 21 #Python
You might like
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
QA工程师岗位职责
2013/11/20 职场文书
工程资料员岗位职责
2014/03/10 职场文书
行政内勤岗位职责
2014/04/07 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
学校火灾防控方案
2014/06/09 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers