ITPub博客

首页 > 数据库 > 数据库开发技术 > Flask + Ant Vue 实战 (7)-WTF参数绑定校验

Flask + Ant Vue 实战 (7)-WTF参数绑定校验

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-02-24 17:07:12 0 删除 编辑

前言

参数绑定校验,主要是为了规范我们的前端参数输入参数的要求,有些参数必填,有些参数是可选,有些是需要指定类型,有些是需要指定长度。有些需要校验邮箱格式,等。

在flask中我们的可以直接的使用Flask-WTF 的插件来完成我们的表单验证,但是这个Flask-WTF不适用我们的API接口的请求,它一般是用在后端渲染模式下的表单提交的绑定验证。

所以我们需要自定义wtfroms重写它的获取的到的参数进行重新绑定。

安装wtfroms依赖

定义表单验证基类

进入到我们的公共包common下面的validators定义我们的表单验证的基类:

#!/usr/bin/evn python
# coding=utf-8


from flask import request
from wtforms.validators import StopValidation
from wtforms import Form as WTForm, IntegerField
from common.exc import ParameterException, Fail


def integer_check(form, field):
    if field.data is None:
        raise StopValidation('输入字段不可为空')
    try:
        field.data = int(field.data)
    except ValueError:
        raise StopValidation('不是一个有效整数')


# 自定义的字段类型的
class ExIntegerField(IntegerField):
    """
    校验一个字段是否为正整数
    "
""

    def __init__(self, label=None, validators=None, **kwargs):
        if validators is not None and type(validators) == list:
            validators.insert(0, integer_check)
        else:
            validators = [integer_check]
        super(ExIntegerField, self).__init__(label, validators, **kwargs)


class BaseForm(WTForm):
    def __init__(self):
        #  使用 request.get_json(force=True) 忽略mimetype
        data = request.get_json(silent=True)
        args = request.args.to_dict()
        # 自定义新得对象,不过滤其他需要校验得参数 get_json 这个函数默认情况下只对 mime 为 application/json 的请求可以正确解析。
        if not data and not args:
            # 判断如果是文件表单的提交的时候,还有参数的话,也进行替换一下
            try:
                if 'multipart/form-data' in request.content_type:
                    args = request.form
                else:
                    args = request.form
            except Exception:
                args = request.form
        super(BaseForm, self).__init__(data=data, **args)

    def validate_for_api(self):
        valid = super(BaseForm, self).validate()
        if not valid:
            error_first = ''
            for field in self.errors:
                error_first = self.errors[field][0]
                # 主动抛出异常--截取的是第一个错误的异常信息,不返回全部的错误异常信息
                # print(error_first)
                raise ParameterException(message=error_first)
                # raise Fail(api_code=0, message='不存在此用户信息,请联系管理员!', result=None, success=False)
                # raise CustomizeEnumType200ApiResponse(sta tus_enum=BasicStatus.PARAM_IS_NULL,msg=self.errors[field][0])
            # 直接抛出异常,交给全局异常处理
            # return CustomizeApiResponse(msg=error_first)
            # raise  CustomizeApiResponse(msg=error_first)

        return self

表单实现验证

修改我们的app.py,新增一个表单类CeshiForm对象和测试表单路由地址@app.route('/biaodan'):

from common.validators import BaseForm
from wtforms import StringField,IntegerField
from wtforms.validators import DataRequired

class CeshiForm(BaseForm):
    # 姓名
    name = StringField(validators=[DataRequired(message='名称 必须传入')])
    # 年龄
    age = StringField(validators=[DataRequired(message='年龄 必须传入')])
    # 描述
    description = StringField()
    # 字典类型0为string,1为number
    type = IntegerField(default=0)

    # kklk['uu'] = StringField()

if __name__ == '__main__':
    app = create_app()


    @app.route('/biaodan')
    def biaodan():
        # 根据用户ID来修改的用户信息
        forms = CeshiForm().validate_for_api()
        return Success(api_code=0, result={'name':forms.name.data.strip()}, message='操作成功!')


    app.run(host='127.0.0.1', port='8808', debug=True)

正常的传参情况下:

不传必填情况下:

END

以上是关于我们表单验证实现。

小钟同学 | 文  【原创】【转载请联系本人】| QQ:308711822


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111698