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进行参数校验的更多相关文章

  1. Python 参数校验的进化

    Python 函数参数魔法 事情的起因是感觉目前项目中的参数校验方法写的太简单了,很多时候需要在server层再if else处理,于是就动手准备写一个好用一点的,可以自定义校验参数规则的参数校验器, ...

  2. springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743

    https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...

  3. 全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用

    参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我 ...

  4. 全栈项目|小书架|服务器开发-Koa2 参数校验处理

    为什么需要做参数校验 在开发中,无论是App开发还是服务器接口开发, 我们无法去预测用户传入的数据,因此参数(数据)校验是开发中不可或缺的一环. 例如像App的注册登录表单提交页面,就要做好多层的判断 ...

  5. jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...

  6. 2013流行Python项目汇总

    2013流行Python项目汇总 转自:http://www.kankanews.com/ICkengine/archives/102963.shtml Python作为程序员的宠儿,越来越得到人们的 ...

  7. 以正确的方式开源 Python 项目

    以正确的方式开源 Python 项目 大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清 晰和无痛.我不是 ...

  8. 流行的Python项目汇总

    年有哪些流行的Python项目呢?下面,我们一起来看下. 一.测试和调试 python_koans :Python Koans 算 “Ruby Koans” 的一部分,作为交互式教程,可以学习 TDD ...

  9. 以正确的方式开源 Python 项目(转)

    大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清晰和无痛.我不是简单的指——“创建一个GitHub库,提 ...

随机推荐

  1. Part 2:模型与后台管理admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  2. 新awk整理

    总感觉上一篇awk的总结几乎是照着man翻译过来的,惨不忍睹 无意间在互联网上有找到了宝贵的资料 感觉整理的很好,想着照着这个来重新写下,对照新的man更新下吧,只是总是在改变的 一.awk简介二.a ...

  3. sed替换文本

    [root@localhost.localdomain home]#cat test ### @2=1492785988 /* INT meta=0 nullable=0 is_null=0 */ # ...

  4. 【原创】源码角度分析Android的消息机制系列(二)——ThreadLocal的工作过程

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一篇文章中,我们已经提到了ThreadLocal,它并非线程,而是在线程中存储数据用的.数据存储以后,只能在指定的线程中获取到数据,对于其 ...

  5. Jmeter_脚本参数化与内存溢出的解决方案

    这一篇文章随便说一下JMETER的脚本参数化 1:Parameters的两种参数化方法 1.1:函数助手参数化 首先准备你的参数数据.我在bin/data中新建了一个dat文件,记事本另存为修改编码为 ...

  6. Round trip 流程图

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢!

  7. yii 缓存之apc

    首先yii CApcCache 实现了一个针对APC的缓存应用组件,常见的缓存操作方法get,set,add,delete,flush... 下面说说配置: 1. 在config/main.php c ...

  8. ansible playbook实践(二)-基础相关命令

    ansible相关的命令: ansible  用来执行ansible管理命令 ansible-doc 用来获取模块的帮助文档 ansible-playbook 当有众多任务时,可编写成playbook ...

  9. MySQL学习笔记(二)

    连接与断开服务器 应该以下面的方式连接MySQL服务器,而不是将密码以明文方式输入连接. C:\> mysql -h host -u user -pEnter password: ******* ...

  10. Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)

    <Windows Azure Platform 系列文章目录> PowerShell我已经提交到GitHub: https://github.com/leizhang1984/AzureC ...