python项目使用jsonschema进行参数校验
python项目使用jsonschema进行参数校验
最近想要给一个新的openstack项目加上参数校验,过完年回来准备开工的时候,发现其他人已经在做了,对应的patch是:https://review.openstack.org/#/c/422547/
作者写的很棒,但是对比nova的实现还有一些不足,这里记一下学习笔记
参数校验这个功能,作者大致的实现思路很明确,通过装饰器进行,是这样
@check_input(参数)
def post():
pass
def check_input(参数):
def wrapper(f):
## check
f()
return wrapper
作者选用jscon schem进行参数校验,jsonschem的一个使用方式如下:
from jsonschema.validators import Draft4Validator
#这里的schem表示至少两个布尔变量
validator = Draft4Validator(
schema={"items": {"type": "boolean"}, "minItems": 2},)
validator.validate([True, False])
validator.validate([True, True, True])
根据这个继续完善之前的代码
post_schem = {...}
validator = Draft4Validator(schem=post_schem)
@check_input(validator,request)
def post():
pass
def check_input(参数):
def wrapper(f):
validator.validate(request.json)
f()
return wrapper
大概的逻辑是这样了,我们会有不同的参数,所以要把参数管理起来,所以作者写了一个单独的schemas.py 来管理所有schema
flavor_schema = {...}
jsonschema.Draft4Validator.check_schema(flavor_schema)
SCHEMAS = {'flavor_schema': flavor_schema}
作者为了更方便地使用validator,写了新的valiator
#validator.py
class Validator(object):
def __init__(self, name):
self.name = name
self.schema = schemas.SCHEMAS.get(name)
checker = jsonschema.FormatChecker()
self.validator = validators.Draft4Validator(self.schema,
format_checker=checker)
def validate(self, data):
try:
self.validator.validate(data)
except jsonschema.ValidationError as ex:
LOG.exception(ex.message)
# TODO(ramineni):raise valence specific exception
raise Exception(ex.message)
最终的check_input函数实现:
##validator.py
def check_input(validator, request):
def decorated(f):
@wraps(f)
def wrapper(*args, **kwargs):
data = request.json
LOG.debug("validating input %s with %s", data, validator.name)
validator.validate(data)
##这里看起来有个bug,应该是f(*args, **kwargs),未测试
return f()
return wrapper
return decorated
这样通过下面的方式就可以进行参数校验了:
import validator
flavor_validator = validator.Validator('flavor_schema')
@validator.check_input(flavor_validator, request)
作者写的很好,但是个人觉得名叫validator的变量实在太多了,看的很糊涂。
看了下nova项目的validator实现,思路也是类似的,但是写的更漂亮了,使用起来也比这个更简单了,下面是nova中check_input函数的实现,区别在于不需要先构建validator再使用装饰器,validator在装饰器执行的过程中构建,代码更简洁优雅。另外使用kwargs['body']而不是request.json, 所以也不需要传入request。
def schema(request_body_schema, min_version=None, max_version=None):
def add_validator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
#在_schema_validation_helper函数中构建了validator
_schema_validation_helper(request_body_schema, kwargs['body'],
min_version, max_version,
args, kwargs)
return func(*args, **kwargs)
return wrapper
return add_validator
python项目使用jsonschema进行参数校验的更多相关文章
- Python 参数校验的进化
Python 函数参数魔法 事情的起因是感觉目前项目中的参数校验方法写的太简单了,很多时候需要在server层再if else处理,于是就动手准备写一个好用一点的,可以自定义校验参数规则的参数校验器, ...
- springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743
https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...
- 全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用
参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我 ...
- 全栈项目|小书架|服务器开发-Koa2 参数校验处理
为什么需要做参数校验 在开发中,无论是App开发还是服务器接口开发, 我们无法去预测用户传入的数据,因此参数(数据)校验是开发中不可或缺的一环. 例如像App的注册登录表单提交页面,就要做好多层的判断 ...
- jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).
Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...
- 2013流行Python项目汇总
2013流行Python项目汇总 转自:http://www.kankanews.com/ICkengine/archives/102963.shtml Python作为程序员的宠儿,越来越得到人们的 ...
- 以正确的方式开源 Python 项目
以正确的方式开源 Python 项目 大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清 晰和无痛.我不是 ...
- 流行的Python项目汇总
年有哪些流行的Python项目呢?下面,我们一起来看下. 一.测试和调试 python_koans :Python Koans 算 “Ruby Koans” 的一部分,作为交互式教程,可以学习 TDD ...
- 以正确的方式开源 Python 项目(转)
大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清晰和无痛.我不是简单的指——“创建一个GitHub库,提 ...
随机推荐
- 壮美大山包-2017中国大山包国际超百公里ITRA积分赛赛记
2017年4月份用时28个多小时跑完江南100,付出的代价是双脚多达8个以上的水泡.所以接下来的4月29日的环汶川越野赛果断的从60公里换到了30公里组,慢悠悠的完成了. 虽然在赛道上一度想再也不参加 ...
- android dialog弹出的情况下监听返回键
view = LayoutInflater.from(getActivity()).inflate( R.layout.dialog_tips, null); title2 = (TextView) ...
- 嵌套for in循环组合cat方式文件中包含空格问题
关于循环嵌套使用for循环的空格问题 原创不易,转载请注明 需求: 现有两个功文件,需要将文件拼接 [root@localhost ~]# cat name 111 222 223 333 444 5 ...
- awk中引用shell变量执行替换的脚本
遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [root@154 home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 PO ...
- MySQL主从复制-xtrabackup的使用与延时复制(附原理图)
标签(linux): mysql 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 xtrabackup是percona公司针对MySQL开发的一款开源的物理备份工 ...
- JavaScript:事件对象Event和冒泡
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 绑定事件的两种方式 我们在上一篇文章中已经讲过事件的概念.这里讲一下注册 ...
- 9 C. Hexadecimal's Numbers
题目链接 http://codeforces.com/contest/9/problem/C 题目大意 输入n,计算出n之内只有0和1组成的数字的数量 分析 k从1开始,只要小于n,就给sum++,并 ...
- chrome disable-web-security 关闭安全策略 解决跨域
Chrome 跨域访问线上接口 时间:2016-04-21 作者:zhongxia 前后端分离之后,联调的时候就会出现问题,那就是Ajax跨域问题. 跨域问题的解决方案有很多种比如常规的 后端使用CR ...
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- 夏令营讲课内容整理 Day 6 Part 3.
第三部分主要讲的是倍增思想及其应用. 在Day3的整理中,我简要提到了倍增思想,我们来回顾一下. 倍增是根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作的一种思想,它在变化规则相同的情况下,加速 ...