修改flask_wtf 使其支持url参数,post参数
flask的插件flask_wtf默认只支持jinjian2的模板上传表单,不支持其他,如果flask改为前后端分离,那么对flask_wtf进行修改支持url-args参数,post上传的参数,以及json
继承父类flask_wtf的Form,代码如下:
1 # coding=utf-8 2 3 from flask import request 4 from wtforms import Form 5 from OnlineClassroom.app.err.BindValidateErr import BindValidateErr 6 7 # request data 基础验证器 8 class RequestBaseForm(Form): 9 # 解析请求参数 10 def __init__(self): 11 if request.method == "GET": 12 data = request.args.to_dict() 13 super(RequestBaseForm, self).__init__(data=data) 14 15 # 解析非get请求的参数,如果是json则request.get_json()得到数据... 16 if "application/json" in request.headers.get("Content-Type") and request.method not in "GET": 17 data = request.get_json(silent=True) 18 super(RequestBaseForm, self).__init__(data=data) 19 elif "application/json" not in request.headers.get("Content-Type") and request.method not in "GET": 20 # application/x-www-form-urlencoded or multipart/form-data 21 data = request.form.to_dict() 22 super(RequestBaseForm, self).__init__(data=data) 23 24 # 对验证错误的参数抛出异常 25 def validate_for_api(self): 26 valid = super(RequestBaseForm, self).validate() 27 if not valid: 28 # 一个bind数据绑定错误返回方法,默认json序列化了 29 self.BindErrToRes("field is not bind") 30 return False 31 return True 32 33 34 # bind数据没有根据绑定的要求所返回的json数据 35 bindErr = None 36 def BindErrToRes(self,msg): 37 self.bindErr = BindValidateErr(msg)
表单测试样式:
1 # coding=utf-8 2 3 from .RequestBaseForm import RequestBaseForm 4 from wtforms import StringField 5 from wtforms.validators import DataRequired,Length 6 7 class Testform(RequestBaseForm): 8 username = StringField("username",validators=[DataRequired(),Length(min=2,max=20)])
路由测试代码如下:
1 @user.route("/index",methods=["GET","POST"]) 2 def test(): 3 4 item = Testform() 5 if not item.validate_for_api(): 6 return item.bindErr # 如果不通过直接返回 7 8 return {"code":0,"msg":"success","data":item.username.data}
测试情况如下:
url传参请求,get

post请求异常,因为在拦截器中写入了只支持get请求才对url参数进行解析

form-data:
post请求可以正常解析

get请求则拦截器直接pass,无法解析

form-urlencoded:
post请求

get请求

json:
post请求

get请求

其中表单对数据进行拦截,比如超过规定长度也会使拦截器判断不符合规定,返回异常

这个表单表示示必须该字段有并最小2个字段最大20个字段,不符合则返回


浙公网安备 33010602011771号