开头

flask接口开发中参数校验可以用到的方法有很多,但是我比较喜欢跟前端的js检验类似,故选用到了 jsonschema 这个参数校验的库

Demo

下面是一个比较全的参数校验的接口,日后方便参考 官方链接 http://json-schema.org/learn/getting-started-step-by-step

from jsonschema import validate, ValidationError # 导入参数的包

@app.route('/login4', methods=['POST'])
def login4():
body = request.get_json()
try:
validate(
body,
{
"$schema": "http://json-schema.org/learn/getting-started-step-by-step",
# 描述对应的JSON元素,title相对来说,更加简洁
"title": "book info",
# 描述对应的JSON元素,description更加倾向于详细描述相关信息
"description": "some information about book",
# 该关键字用于限定待校验JSON元素所属的数据类型,取值可为:object,array,integer,number,string,boolean,null
"type": "object",
# 用于指定JSON对象中的各种不同key应该满足的校验逻辑,
# 如果待校验JSON对象中所有值都能够通过该关键字值中定义的对应key的校验逻辑,每个key对应的值,都是一个JSON Schema,则待校验JSON对象通过校验。
"properties": {
"id": {
"description": "The unique identifier for a book",
"type": "integer",
"minimum": 1
},
"name": {
"description": "book name",
"type": "string",
"minLength": 3,
"maxLength": 30
},
"info": {
"description": "simple information about book",
"type": "string",
"minLength": 10,
"maxLength": 60
},
"tips": {
"anyOf": [ # 满足其中一个类型 就行
{"type": "string", "minLength": 10, "maxLength": 60},
{"type": "number", "minimum": 5.0}
]
},
"price": {
"description": "book price",
"type": "number",
# 能被0.5整除
"multipleOf": 0.5,
# 这里取等,5.0=<price<=99999.0
"minimum": 5.0,
"maximum": 99999.0,
# 若使用下面这两个关键字则 5.0<price<99999.0
# "exclusiveMinimum": 5.0,
# "exclusiveMaximum": 99999.0
},
"tags": {
"type": "array",
"items": [
{
"type": "string",
"minLength": 2,
"maxLength": 8
},
{
"type": "number",
"minimum": 1.0
}
],
# 待校验JSON数组第一个元素是string类型,且可接受的最短长度为5个字符,第二个元素是number类型,且可接受的最小值为10
# 剩余的其他元素是string类型,且可接受的最短长度为2。
"additonalItems": {
"type": "string",
"miniLength": 2
},
# 至少一个
"miniItems": 1,
# 最多5个
"maxItems": 5,
# 值为true时,所有元素都具有唯一性时,才能通过校验。
"uniqueItems": True
},
"date": {
"description": "书籍出版日期",
"type": "string",
# 可以是以下取值:date、date-time(时间格式)、email(邮件格式)、hostname(网站地址格式)、ipv4、ipv6、uri等。
# 使用format关键字时,在实例化validator时必须给它传format_checker参数,值如:draft7_format_checker, 网址:
# https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft7Validator
"format": "date",
},
"bookcoding": {
"description": "书籍编码",
"type": "string",
# 符合该关键字指定的正则表达式,才算通过校验。
"pattern": "^[A-Z]+[a-zA-Z0-9]{12}$"
},
"other": {
"description": "其他信息",
"type": "object",
"properties": {
"info1": {
"type": "string"
},
"info2": {
"type": "string"
}
}
}
},
# 指定了待校验JSON对象可以接受的最少 一级key 的个数
"minProperties": 3,
# 指定了待校验JSON对象可以接受的最多 一级key 的个数。
"maxProperties": 7,
# patternProperties对象的每一个一级key都是一个正则表达式,value都是一个JSON Schema。
# 只有待校验JSON对象中的一级key,通过与之匹配的patternProperties中的一级正则表达式,对应的JSON Schema的校验,才算通过校验。
# 下面的JSON Schema表示, 所有以a开头的一级key的value都必须是number,
"patternProperties": {
"^a": {
"type": "number"
},
},
# 如果待校验JSON对象中存在,既没有在properties中被定义,又没有在patternProperties中被定义,那么这些一级key必须通过additionalProperties的校验。
"additionalProperties": {
"desc": {
"type": "string",
"minLength": 1
},
},
# 该关键字限制了JSON对象中必须包含哪些一级key。
# 如果一个JSON对象中含有required关键字所指定的所有一级key,则该JSON对象能够通过校验。
"required": ["id", "name", "info", "price"]
}) except ValidationError as e:
msg = "json数据不符合schema规定:\n出错字段:{}\n提示信息:{}".format(" --> ".join([i for i in e.path]), e.message)
print(msg)
return jsonify(status=500, msg=msg) print(body)
title = body.get('title')
return '1'

添加一个数组里面包含字典的参数检验

# 周报添加游戏
@platform_blue.route('/add_week_game', methods=["POST"])
def add_week_game():
body = request.get_json()
try:
validate(body, {
'type': 'object',
"description": "添加", # 参数建议,添加数组里面包含字典的
'properties': {
"data_lists": {
"type": "array",
"items": {
"type":"object",
"required":["a", "b"],
"properties":{
"a":{"type":"string", "minLength":1},
"b":{"type":"string", "minLength":1},
}}
},
"user_id":{
"description": "用户id",
'type': 'integer'
},
"id":{
"description": "用户id",
'type': 'integer'
}
},
'required': ['data_lists', 'user_id', 'id']
})
except ValidationError as e:
print(e)
# msg = "参数不符合规定;{} 提示信息: {}".format(" --> ".join([i for i in e.path]), e.message)
# print(msg)
return jsonify(status=RET.OK, msg=e)

完。

flask接口参数校验 jsonschema 的使用的更多相关文章

  1. Spring Boot 之:接口参数校验

    Spring Boot 之:接口参数校验,学习资料 网址 SpringBoot(八) JSR-303 数据验证(写的比较好) https://qq343509740.gitee.io/2018/07/ ...

  2. Spring Boot实现通用的接口参数校验

    Spring Boot实现通用的接口参数校验 Harries Blog™ 2018-05-10 2418 阅读 http ACE Spring App API https AOP apache IDE ...

  3. SpringBoot实现通用的接口参数校验

    本文介绍基于Spring Boot和JDK8编写一个AOP,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在实体类上添加注解,但对于不同的方法,所应用的校验规则也是不一样的,例 ...

  4. springboot 接口参数校验

    前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...

  5. 接口参数校验之@Valid与BindingResult

    接口方法往往需要对入参做一些校验,从而判断入参是否合格,而javax.validation包为我们提供了一些常用的参数校验注解,使用起来很方便. 下面这个示例是检验入参对象中的password是否为空 ...

  6. 【快学springboot】4.接口参数校验

    前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...

  7. 接口参数校验(不使用hibernate-validator,规避大量if else)

    引言 编写接口时,常用的参数校验使用hibernate-validator注解+@@Validated注解进行参数校验.当遇到一些特殊场景或需求,需要自己对参数进行手动校验时,会出现以下问题: 不可避 ...

  8. Flask开发技巧之参数校验

    Flask开发技巧之参数校验 目录 Flask开发技巧之参数校验 1.请求参数分类 2.解决方案使用到的库 3.针对url查询参数与一般json格式 4.针对复杂json格式数据 本人平时开发中使用的 ...

  9. Spring Boot 参数校验

    1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spr ...

  10. springboot 参数校验详解

    https://www.jianshu.com/p/89a675b7c900 在日常开发写rest接口时,接口参数校验这一部分是必须的,但是如果全部用代码去做,显得十分麻烦,spring也提供了这部分 ...

随机推荐

  1. Codeforces Round #803 (Div. 2) A-D 刚vp完还没补题

    Codeforces Round #803 (Div. 2) 2022/7/24 上午VP 传送门:https://codeforces.com/contest/1698 A. XOR Mixup 随 ...

  2. MySql 入门——日期计算

    MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数.分钟数.小时数.天数.周数.季度数.月数.年数,当前日期增加或者减少一天.一周等等 SELECT TIMESTAMPDIFF( ...

  3. 关于使用antd-proTable,报错 ResizeObserver loop limit exceeded

    错误如上,原因有几种情况 一:columns中,属性又ellipsis属性,但是没有设置width,导致table不知道如何计算在什么时候,开始对内容进行加省略号,出现了计算错误 如  const c ...

  4. windows系统下使用java语言,在mysql数据库中做定时数据备份、删除

    有这样一个业务需求,需要将数据归档的表每月定时备份,并且删除之前表中的数据,话不多说,直接上代码! 注意:这种方法适合数据量小,业务要求不高的场景! 项目采用SpringBoot  + MyBatis ...

  5. Command Injection-命令注入(命令执行)

    什么是命令注入? 命令注入是滥用应用程序的行为在操作系统上执行命令,使用与设备上的应用程序运行时相同的权限.例如,在作为名为joe的用户运行的web服务器上实现命令注入将在该joe用户下执行命令,从而 ...

  6. 计网学习笔记三 MAC与LAN

    在上一讲中,我们学习了链路层可以提供的服务:framing,link access,reliable delivery,error detection&correction.这一讲我们从lin ...

  7. Javaweb基础知识复习------AJAX

    AJAX相关知识复习 简而言之,就是可以用AJAX+HTML代替JSP页面,也可以进行异步交互,更新部分界面 Ajax案例 后端代码就是一个servlet文件,前端页面的代码也不是很常用,可以在下面这 ...

  8. JMM知识点总结

    JMM知识点总结 一.什么是JMM? 不知道大家在学习的过程有没有思考过这两个问题 为什么说java是跨平台语言 导致并发问题的原因是什么 第一个问题,我是这么理解的,代码运行本质上是将我们写的语言转 ...

  9. 【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系

    并发编程的难题和挑战 在并发编程的技术领域中,对于我们而言的难题主要有两个: 多线程之间如何进行通信和线程之间如何同步,通信是指线程之间以何种机制来交换信息. 多线程的线程通信机制 在命令式编程中,线 ...

  10. 一个斜杠引发的CDN资源回源请求量飙升

    背景 一个安静的晚上,突然接到小伙伴电话线上CDN回源异常,具体表现为请求量飙升,且伴有少量请求404,其中回源请求量飙升已经持续两天但一直未被发现,直到最近404请求触发了告警后分析log才同时发现 ...