参数绑定校验,主要是为了规范我们的前端参数输入参数的要求,有些参数必填,有些参数是可选,有些是需要指定类型,有些是需要指定长度。有些需要校验邮箱格式,等。
在flask中我们的可以直接的使用Flask-WTF 的插件来完成我们的表单验证,但是这个Flask-WTF不适用我们的API接口的请求,它一般是用在后端渲染模式下的表单提交的绑定验证。
所以我们需要自定义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)
正常的传参情况下:
不传必填情况下:
以上是关于我们表单验证实现。
小钟同学 | 文 【原创】【转载请联系本人】| QQ:308711822
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。