Flask开发技巧之参数校验

目录
  • Flask开发技巧之参数校验

    • 1、请求参数分类

    • 2、解决方案使用到的库

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

    • 4、针对复杂json格式数据

本人平时开发中使用的,或者学习到的一些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 WTFormspip 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_jsonclass 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/

(0)

相关推荐

  • python测试开发django-rest-framework-90.唯一字段校验UniqueValidator

    前言 接着前面ModelSerializer 反序列化的时候,写入到数据库时,有些字段是唯一的,不能重复写到数据库,如商品code,具有唯一性. UniqueValidator UniqueValid ...

  • python测试开发django-rest-framework-93.联合唯一校验

    前言 前面添加商品,商品code只能添加一次可以用唯一字段校验UniqueValidator,如果用户收藏商品,一个用户可以收藏多个商品,一个商品也可以被多个人收藏. 但是同一个人针对同一个商品,只能 ...

  • 9个实用的JavaScript开发技巧,你必须知道一下

    WEB前端开发社区 昨天 从Web开发到机器学习再到应用程序开发,JavaScript拥有大量的应用程序列表. 幸运的是,JavaScript提供了可以方便使用的全面功能列表,但是,其中许多功能和ha ...

  • 客户成交正循环法——让你的订单源源不断的客户资源开发技巧

    就像环保主义提倡的资源再利用,销售也可以把自己的资源再次盘活,生成新的订单.这比起你去开发新的客户群体要来的轻松.容易,只要你能做好这二点: 一.客户成交,是你维客的契机 对于成交后客户来说,你的应答 ...

  • 【操作技巧】RSI指标使用技巧和参数设置

    相对强弱指标RSI,是用来判断买卖双方力量强弱的技术指标,由韦尔斯-王尔德提出.外汇交易中有很多常见的指标,rsi指标就是其中一个.那么rsi指标参数怎么设置?如果不清楚外汇rsi指标参数设置的方法, ...

  • 一周内翻倍引体次数:人人都是天才,但缺乏开发技巧

    本周我们FE邀请了康复作者徐杰作为特约嘉宾. 徐杰是Walk to Health康复中心创始人,也是知乎健身和康复优质作者,拥有多个国际康复认 证,曾多次为武警.海军以及空军进行军事体能训练及训练伤康 ...

  • 技巧 | 新建参数,默认跑到几何体里面了,怎么办?

    针对CATIA新建参数在结构树上的位置问题,做简单的探讨,小文主要分为以下几个部分: 默认参数创建在零件几何体内部怎么办? 默认参数创建时总弹出选择框怎么办? 开通混合设计是否对参数默认位置有影响? ...

  • web前端培训12个实用的前端开发技巧总结

    前端开发学习技巧是每个人都应该具备的,从基础到精通学前端开发都应该扎实的去掌握,下面介绍前端开发的12个实用技巧. 利用 CSS 穿透覆盖默认样式 常见发生场景:假如我们需要通过 input,type ...

  • PS平面设计技巧以及参数规范教程集

    基础没有,概念不清,很容易进入误区,而且错误百出,不自信.干一行爱一行,成为行家里手,需要就是基础牢固,基本功扎实,然后再能在这个基础上,生根发芽,茁壮成长,开花结果.不然必然难成大器,昙花一现或者门 ...