Flask开发技巧之参数校验

本人平时开发中使用的,或者学习到的一些flask开发技巧整理,需要已有较为扎实的flask基础。

1、请求参数分类

一般来说,前端发送过来的请求中,大致包含以下三种类型的参数,分别是url路径参数,url查询参数,还有目前前后端分离开发中最常见的json格式的数据。

  • url路径参数
/v1/user/1

url路径参数即类似于上述例子中的参数,直接带在url路径中,可变化,flask针对这种参数,已经直接提供了支持,例:

@app.route('/v1/user/<int:id>')
  • url查询参数
/v1/user?page=1&pageSize=10

类似于这种带在url中的问号后面的键值对并且用&连接的参数称为url查询参数

  • json格式的参数
{
"name": "xiaowang",
"age": 1
}

而json格式的参数就更不用多说了,header中带有Content-Type:Application/json传输过来的json格式的数据就是这样的。

2、解决方案使用到的库

这里我们为了解决参数校验的问题,一定是要将参数校验的部分抽离出来,按照面向对象的思想,隐藏参数校验的具体过程,交给特定的类去解决。这样,我们在视图函数中,不会出现冗余的参数校验代码,会使整个视图函数显得简短易读。

这里我们需要安装两个库

pip install WTForms
pip install WTForms-JSON

后续方法建立在wtforms库上扩展,所有wtforms库原有的操作,全部都有效,可以继续使用。如果不熟悉wtforms,需要先学习一下。

3、针对url查询参数与一般json格式

首先解释一下,经过我的探究(本人能力有限,可能无法扩展实现),使用普通的wtforms库,无法接受复杂格式的json数据,只能接受普通格式的json数据以及url查询参数进行校验。

  • 普通格式的json参数举例
{
"name": "xiaowang",
"age": 1,
"address": "beijing"
}
  • 复杂格式的json参数举例
{
"category": {
"category_name": "电脑",
"category_id": 2
},
"address_list": [
"beijing",
"shanghai"
]
"name": "xiaohong",
"age": 1,
}

实现方法,继承wtforms库中的Form,实现自己的基类参数验证类BaseForm

class BaseForm(Form):
def __init__(self):
data = request.get_json()
args = request.args.to_dict()
super(BaseForm, self).__init__(data=data, **args) def validate_for_api(self):
valid = super(BaseForm, self).validate()
if not valid:
raise ParameterException(msg=self.errors)
return self

这里进行一下说明,BaseForm的__init__方法实例化对象的时候首先通过flask中的request对象将普通json数据和查询参数args拿到,通过调用父类的方法将参数初始化。

而validate_for_api()方法则调用父类中的validate()进行参数校验,如果校验结果不通过,那么将错误信息放入msg交给异常类400处理,异常处理我们已经在上一篇详细讲述。如果校验通过,那么就将校验完成的form返回。

使用举例

针对一个请求url为

/v1/user?user_id=1

请求体为

{
"username": "xiaoming",
"age": 1
}

那么使用如下类:

class UserForm(BaseForm):
user_id = IntegerField()
username = StringField()
age = IntegerField() form = UserForm().validate_for_api()

即可完成参数校验,如果校验出错,会直接向前端返回400,并且错误信息也会附带返回。

4、针对复杂json格式数据

单纯的使用wtforms库无法实现复杂json格式数据的处理,于是在我的探索下,发现还有一个wtforms的扩展库,叫wtforms-json,通过这个库可以实现。

于是扩展原先的BaseForm,使用wtforms-json,仿照原先基类,我实现的新基类如下。

import wtforms_json

class JsonForm(Form):

    @classmethod
def init_and_validate(cls):
wtforms_json.init()
form = cls.from_json(request.get_json())
valid = form.validate()
if not valid:
raise ParameterException(msg=form.errors)
return form

继承上述新的基类,这样的Form就可以实现任意json格式的数据的校验了。

使用举例

针对一个请求,请求体如果为

{
"username": "xiaochen",
"age": 1,
"address_list": [
"beijing",
"shanghai"
],
"info": {
"name": "hi",
"length": 5
},
"area_list": [
{
"level1": "北京",
"level2": "朝阳"
},
{
"level1": "北京",
"level2": "海淀"
}
]
}

通过如下Form就可以实现校验

class InfoForm(JsonForm):
name = StringField()
length = IntegerField() class AreaForm(JsonForm):
level1 = StringField()
levle2 = StringField() class DemoForm(JsonForm):
username = StringField()
age = IntegerField()
address_list = FieldList(
StringField(),
min_entries=1
)
info = FormField(InfoForm)
area_list = FieldList(
FormField(AreaForm),
min_entries=1
) form = DemoForm().init_and_validate()

如此就可以实现复杂json数据的校验

关于flask的参数校验,以上就是我目前掌握的一些技巧,如有错误欢迎指出。


博客园: https://www.cnblogs.com/luyuze95/

GitHub: https://github.com/luyuze95

Flask开发技巧之参数校验的更多相关文章

  1. Flask开发技巧之异常处理

    Flask开发技巧之异常处理 目录 Flask开发技巧之异常处理 1.Flask内置异常处理 2.HTTPException类分析 3.自定义异常处理类 4.方便的定义自己的错误类 5.注意事项 本人 ...

  2. Spring基础系列-参数校验

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9953744.html Spring中使用参数校验 概述 ​ JSR 303中提出了Bea ...

  3. 后端参数校验器v1.0(调用一个方法校验所有参数并得到校验结果,且包括错误原因)

    一:介绍 在写后端时,面对多个参数,比如手机号码.密码等我们常常需要写验证逻辑,当需要验证的参数较多的时候我们会需要写很多的判断语句,这就造成了大量的代码冗余.因此我开发了一套参数验证器,只需要调用参 ...

  4. gin使用validator库参数校验若干实用技巧

    validator库参数校验若干实用技巧 本文介绍了使用validator库做参数校验的一些十分实用的使用技巧,包括翻译校验错误提示信息.自定义提示信息的字段名称.自定义校验方法等. validato ...

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

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

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

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

  7. 测试开发专题:如何在spring-boot中进行参数校验

    上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中 ...

  8. http get post 参数校验

    spring boot 常见http get ,post请求参数处理   在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台 ...

  9. 5-MySQL DBA笔记-开发技巧

    第5章 开发技巧 本章将介绍一些和数据库相关的开发技巧.由于开发领域很广,这里只选取部分比较常见的小技巧.5.1 存储树形数据 有时我们需要保存一些树形的数据结构,比如组织架构.话题讨论.知识管理.商 ...

随机推荐

  1. NOIP前一些题目的理解

    ZYB和售货机(图论,环) 题目链接 个人感觉这道题与基环树没有任何关系,你会发现,每个点最多只有一个入度和出度,所以只能是链或环. 还有就是本题的突破点就在于正确建图,题目的限制保证每个点的入度不大 ...

  2. 【进阶之路】Redis基础知识两篇就满足(一)

    导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第一篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...

  3. 【建议收藏】阿里P7总结的Spring注解笔记,把组件注册讲的明明白白

    环境搭建 注解的方式是通过配置类的方式来注入组件,注解注入要比XML注入的方式简单,注解注入也需要在前者的基础上,添加一个spring-context的包,也是实际开发中常用的方式. 准备所需Jar包 ...

  4. 执行文件异常报错:ImportError: attempted relative import with no known parent package

    这个问题困扰了我很久了,网上的解决方法都很一致,找来找去都是一样的解决方法,在导入包的文件和执行文件加入 1 print('__file__={0:<35} | __name__={1:< ...

  5. X86中断/异常与APIC

    异常(exception)是由软件或硬件产生的,分为同步异常和异步异常.同步异常即CPU执行指令期间同步产生的异常,比如常见的除零错误.访问不在RAM中的内存 .MMU 发现当前虚拟地址没有对应的物理 ...

  6. seata

    启动seataserver: 回滚日志: server日志: file模式的文件 整个过程如果观察数据库变化的话,会发现事务是先提交了的,出现异常之后由seata又回滚回去

  7. @Transactional自调用问题

  8. 测试:DOCX

    先拿到的是需求文档和接口文档以及测试用例模块,[以及之前写好的测试用例]再根据分配的任务进行编写用例 [智能看懂业务需求]现有功能点,在编写用例 [项目介绍]: 辽阳农商惠生活项目是作为一个农户和银行 ...

  9. python办公入门7:xlwt

    xlwt写入excel步骤 创建工作簿 创建工作表 填充工作表内容 保存文件 1 import xlwt 2 3 #创建工作簿 4 wb=xlwt.Workbook() 5 #创建工作表 6 ws=w ...

  10. HBase中Memstore存在的意义以及多列族引起的问题和设计

    Memstore存在的意义 HBase在WAL机制开启的情况下,不考虑块缓存,数据日志会先写入HLog,然后进入Memstore,最后持久化到HFile中.HFile是存储在hdfs上的,WAL预写日 ...