开头

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

Demo

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

  1. from jsonschema import validate, ValidationError # 导入参数的包
  2. @app.route('/login4', methods=['POST'])
  3. def login4():
  4. body = request.get_json()
  5. try:
  6. validate(
  7. body,
  8. {
  9. "$schema": "http://json-schema.org/learn/getting-started-step-by-step",
  10. # 描述对应的JSON元素,title相对来说,更加简洁
  11. "title": "book info",
  12. # 描述对应的JSON元素,description更加倾向于详细描述相关信息
  13. "description": "some information about book",
  14. # 该关键字用于限定待校验JSON元素所属的数据类型,取值可为:object,array,integer,number,string,boolean,null
  15. "type": "object",
  16. # 用于指定JSON对象中的各种不同key应该满足的校验逻辑,
  17. # 如果待校验JSON对象中所有值都能够通过该关键字值中定义的对应key的校验逻辑,每个key对应的值,都是一个JSON Schema,则待校验JSON对象通过校验。
  18. "properties": {
  19. "id": {
  20. "description": "The unique identifier for a book",
  21. "type": "integer",
  22. "minimum": 1
  23. },
  24. "name": {
  25. "description": "book name",
  26. "type": "string",
  27. "minLength": 3,
  28. "maxLength": 30
  29. },
  30. "info": {
  31. "description": "simple information about book",
  32. "type": "string",
  33. "minLength": 10,
  34. "maxLength": 60
  35. },
  36. "tips": {
  37. "anyOf": [ # 满足其中一个类型 就行
  38. {"type": "string", "minLength": 10, "maxLength": 60},
  39. {"type": "number", "minimum": 5.0}
  40. ]
  41. },
  42. "price": {
  43. "description": "book price",
  44. "type": "number",
  45. # 能被0.5整除
  46. "multipleOf": 0.5,
  47. # 这里取等,5.0=<price<=99999.0
  48. "minimum": 5.0,
  49. "maximum": 99999.0,
  50. # 若使用下面这两个关键字则 5.0<price<99999.0
  51. # "exclusiveMinimum": 5.0,
  52. # "exclusiveMaximum": 99999.0
  53. },
  54. "tags": {
  55. "type": "array",
  56. "items": [
  57. {
  58. "type": "string",
  59. "minLength": 2,
  60. "maxLength": 8
  61. },
  62. {
  63. "type": "number",
  64. "minimum": 1.0
  65. }
  66. ],
  67. # 待校验JSON数组第一个元素是string类型,且可接受的最短长度为5个字符,第二个元素是number类型,且可接受的最小值为10
  68. # 剩余的其他元素是string类型,且可接受的最短长度为2。
  69. "additonalItems": {
  70. "type": "string",
  71. "miniLength": 2
  72. },
  73. # 至少一个
  74. "miniItems": 1,
  75. # 最多5个
  76. "maxItems": 5,
  77. # 值为true时,所有元素都具有唯一性时,才能通过校验。
  78. "uniqueItems": True
  79. },
  80. "date": {
  81. "description": "书籍出版日期",
  82. "type": "string",
  83. # 可以是以下取值:date、date-time(时间格式)、email(邮件格式)、hostname(网站地址格式)、ipv4、ipv6、uri等。
  84. # 使用format关键字时,在实例化validator时必须给它传format_checker参数,值如:draft7_format_checker, 网址:
  85. # https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft7Validator
  86. "format": "date",
  87. },
  88. "bookcoding": {
  89. "description": "书籍编码",
  90. "type": "string",
  91. # 符合该关键字指定的正则表达式,才算通过校验。
  92. "pattern": "^[A-Z]+[a-zA-Z0-9]{12}$"
  93. },
  94. "other": {
  95. "description": "其他信息",
  96. "type": "object",
  97. "properties": {
  98. "info1": {
  99. "type": "string"
  100. },
  101. "info2": {
  102. "type": "string"
  103. }
  104. }
  105. }
  106. },
  107. # 指定了待校验JSON对象可以接受的最少 一级key 的个数
  108. "minProperties": 3,
  109. # 指定了待校验JSON对象可以接受的最多 一级key 的个数。
  110. "maxProperties": 7,
  111. # patternProperties对象的每一个一级key都是一个正则表达式,value都是一个JSON Schema。
  112. # 只有待校验JSON对象中的一级key,通过与之匹配的patternProperties中的一级正则表达式,对应的JSON Schema的校验,才算通过校验。
  113. # 下面的JSON Schema表示, 所有以a开头的一级key的value都必须是number,
  114. "patternProperties": {
  115. "^a": {
  116. "type": "number"
  117. },
  118. },
  119. # 如果待校验JSON对象中存在,既没有在properties中被定义,又没有在patternProperties中被定义,那么这些一级key必须通过additionalProperties的校验。
  120. "additionalProperties": {
  121. "desc": {
  122. "type": "string",
  123. "minLength": 1
  124. },
  125. },
  126. # 该关键字限制了JSON对象中必须包含哪些一级key。
  127. # 如果一个JSON对象中含有required关键字所指定的所有一级key,则该JSON对象能够通过校验。
  128. "required": ["id", "name", "info", "price"]
  129. })
  130. except ValidationError as e:
  131. msg = "json数据不符合schema规定:\n出错字段:{}\n提示信息:{}".format(" --> ".join([i for i in e.path]), e.message)
  132. print(msg)
  133. return jsonify(status=500, msg=msg)
  134. print(body)
  135. title = body.get('title')
  136. return '1'

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

  1. # 周报添加游戏
  2. @platform_blue.route('/add_week_game', methods=["POST"])
  3. def add_week_game():
  4. body = request.get_json()
  5. try:
  6. validate(body, {
  7. 'type': 'object',
  8. "description": "添加", # 参数建议,添加数组里面包含字典的
  9. 'properties': {
  10. "data_lists": {
  11. "type": "array",
  12. "items": {
  13. "type":"object",
  14. "required":["a", "b"],
  15. "properties":{
  16. "a":{"type":"string", "minLength":1},
  17. "b":{"type":"string", "minLength":1},
  18. }}
  19. },
  20. "user_id":{
  21. "description": "用户id",
  22. 'type': 'integer'
  23. },
  24. "id":{
  25. "description": "用户id",
  26. 'type': 'integer'
  27. }
  28. },
  29. 'required': ['data_lists', 'user_id', 'id']
  30. })
  31. except ValidationError as e:
  32. print(e)
  33. # msg = "参数不符合规定;{} 提示信息: {}".format(" --> ".join([i for i in e.path]), e.message)
  34. # print(msg)
  35. 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. 【其他】etcd

    配置 node1 name: etcd-1 data-dir: /data/etcd/node1 listen-client-urls: http://127.0.0.1:6701 advertise ...

  2. 《MySQL是怎样运行的》第三章小结

  3. Centos7 禁用IPV6地址的方法

    方法 1 编辑文件/etc/sysctl.conf, vi /etc/sysctl.conf 添加下面的行: net.ipv6.conf.all.disable_ipv6 =1 net.ipv6.co ...

  4. SpringBoot笔记--自动配置(高级内容)(中集)

    @Enable*注解 使用该注解,需要导入相应的依赖坐标,其中的groupId标签里面写入Bean的Java文件所在的包的路径下面 spring-enable-other 还需要在SpringBoot ...

  5. Mybatisplus----DML编程控制

    乐观锁 (1)业务并发现象带来的问题:秒杀 执行: 1.在类对象中添加version属性,在数据库表中添加version字段(默认值为1) package com.itheima.domain; im ...

  6. MyBatis 延迟加载代码详解

    在我们的实际开发中,会面临各种各样的查询操作.如果单表查询能满足业务需求.尽量用单表查询,因为单表查询的效率比多表关联查询快. 那么当业务需求需要用到的数据来源于多张表的时候,单表查询无法解决,Myb ...

  7. Linux环境下使用jsoncpp

    目录 1. 下载jsoncpp 2. 生成静态库libjsoncpp.a 3. 复制相关文件至/usr/local下(方便编程) 4. CMakeList.txt编写(需要新增的) 1. 下载json ...

  8. rocketMq和kafka对比

    为什么在RocketMQ和kafka中选型 在单机同步发送的场景下,Kafka>RocketMQ,Kafka的吞吐量高达17.3w/s,RocketMQ吞吐量在11.6w/s. kafka高性能 ...

  9. vue之input输入框的几个事件

    目录 事件简介 示例 事件简介 click 点击事件,一般不会用于input输入框,会用于按钮,用于输入框就有点像focus了,当点击输入框时会触发 blur 失去焦点事件,当失去焦点时会触发. fo ...

  10. arc076f F - Exhausted?

    ARC076 F - Exhausted? [题目大意] \(有m个座位,分别位于坐标为1,2,3,...,m的地方:n个客人,第i位客人只坐位于[0,li]∪[ri,m]的座位.每个座位只能坐一个人 ...