python项目使用jsonschema进行参数校验

最近想要给一个新的openstack项目加上参数校验,过完年回来准备开工的时候,发现其他人已经在做了,对应的patch是:https://review.openstack.org/#/c/422547/

作者写的很棒,但是对比nova的实现还有一些不足,这里记一下学习笔记

参数校验这个功能,作者大致的实现思路很明确,通过装饰器进行,是这样

  1. @check_input(参数)
  2. def post():
  3. pass
  4. def check_input(参数):
  5. def wrapper(f):
  6. ## check
  7. f()
  8. return wrapper

作者选用jscon schem进行参数校验,jsonschem的一个使用方式如下:

  1. from jsonschema.validators import Draft4Validator
  2. #这里的schem表示至少两个布尔变量
  3. validator = Draft4Validator(
  4. schema={"items": {"type": "boolean"}, "minItems": 2},)
  5. validator.validate([True, False])
  6. validator.validate([True, True, True])

根据这个继续完善之前的代码

  1. post_schem = {...}
  2. validator = Draft4Validator(schem=post_schem)
  3. @check_input(validatorrequest)
  4. def post():
  5. pass
  6. def check_input(参数):
  7. def wrapper(f):
  8. validator.validate(request.json)
  9. f()
  10. return wrapper

大概的逻辑是这样了,我们会有不同的参数,所以要把参数管理起来,所以作者写了一个单独的schemas.py 来管理所有schema

  1. flavor_schema = {...}
  2. jsonschema.Draft4Validator.check_schema(flavor_schema)
  3. SCHEMAS = {'flavor_schema': flavor_schema}

作者为了更方便地使用validator,写了新的valiator

  1. #validator.py
  2. class Validator(object):
  3. def __init__(self, name):
  4. self.name = name
  5. self.schema = schemas.SCHEMAS.get(name)
  6. checker = jsonschema.FormatChecker()
  7. self.validator = validators.Draft4Validator(self.schema,
  8. format_checker=checker)
  9. def validate(self, data):
  10. try:
  11. self.validator.validate(data)
  12. except jsonschema.ValidationError as ex:
  13. LOG.exception(ex.message)
  14. # TODO(ramineni):raise valence specific exception
  15. raise Exception(ex.message)

最终的check_input函数实现:

  1. ##validator.py
  2. def check_input(validator, request):
  3. def decorated(f):
  4. @wraps(f)
  5. def wrapper(*args, **kwargs):
  6. data = request.json
  7. LOG.debug("validating input %s with %s", data, validator.name)
  8. validator.validate(data)
  9. ##这里看起来有个bug,应该是f(*args, **kwargs),未测试
  10. return f()
  11. return wrapper
  12. return decorated

这样通过下面的方式就可以进行参数校验了:

  1. import validator
  2. flavor_validator = validator.Validator('flavor_schema')
  3. @validator.check_input(flavor_validator, request)

作者写的很好,但是个人觉得名叫validator的变量实在太多了,看的很糊涂。

看了下nova项目的validator实现,思路也是类似的,但是写的更漂亮了,使用起来也比这个更简单了,下面是nova中check_input函数的实现,区别在于不需要先构建validator再使用装饰器,validator在装饰器执行的过程中构建,代码更简洁优雅。另外使用kwargs['body']而不是request.json, 所以也不需要传入request。

  1. def schema(request_body_schema, min_version=None, max_version=None):
  2. def add_validator(func):
  3. @functools.wraps(func)
  4. def wrapper(*args, **kwargs):
  5. #在_schema_validation_helper函数中构建了validator
  6. _schema_validation_helper(request_body_schema, kwargs['body'],
  7. min_version, max_version,
  8. args, kwargs)
  9. return func(*args, **kwargs)
  10. return wrapper
  11. 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. JAVA中实现让程序等待一段时间的方法

    JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式. 方法一:通过线程的sleep方法. Thread.currentThread().sleep(1000); 在需要程序 ...

  2. java获取昨天的日期

    Calendar   cal   =   Calendar.getInstance();  cal.add(Calendar.DATE,   -1);  String yesterday = new ...

  3. 【转】C++易混知识点1: 指针常量和常量指针的区别,附有详细案例解释

    熟悉C++也已经有一些年头了,今天突然翻出当年浏览的书籍,对一些概念居然生疏了,指针常量和常量指针由于 指针 这一特殊的对象而变得难以区别.因此,在思考再三之后,决定写下该篇总结,加强对他们的区别: ...

  4. 【转】c++ 获取程序运行时间

    转自:http://blog.csdn.net/ghevinn/article/details/22800059 DWORD start_time=GetTickCount(); {...} DWOR ...

  5. Python CRM项目七

    仿照Django Admin实现对readonly的字段进行设置 功能点: 1.页面不可进行更改 2.如果改变html代码中的值,则需要进行后端的数据库数据校验 3.可以对某些字段进行自定制校验规则 ...

  6. github上最好的开源MMORPG - stendhal

    Stendhal is a fully fledged multiplayer online adventures game (MORPG). It is completely open source ...

  7. IE7、IE8不兼容js trim函数的解决方法

    IE兼容,有时候让人头疼,但又不得不去解决. 先看看一下代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...

  8. 分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中

    今天学习分析ajax 请求,现把学得记录, 把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件, ...

  9. ubuntu+mono+PetaPoco+Oracle+.net 程序部署

    前言:将windows 下开发的 .net 控制台程序(连接Oracle数据库)部署到 ubuntu 下步骤记录  2017-09-19 实验所用机器为虚拟机Ubuntu16.04  amd64 安装 ...

  10. salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)

    Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf 在项目中 ...