修改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个字段,不符合则返回

 

posted @ 2020-03-04 18:22  花名k  阅读(324)  评论(0)    收藏  举报