python参数检验框架_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 参数校验的进化

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

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

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

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

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

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

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

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库,提 ...

随机推荐

第3月第15天 afconvert lame

1. //CAF 转换成MP3 (可以) afconvert -f mp4f -d aac -b 128000 /Users/amarishuyi/Desktop/sound1.caf/Users/a ...

每天一个linux命令(30):cal 命令

cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”. 1.命令格式: cal  ...

flexgrid的应用

第一.导入必须的CSS与JS:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值