flask修改flask_wtf使其支持json數據的validation驗證


flask默認是前后端不分離策略,前端通過flask+wtf表單來傳遞post,put...等數據.

 

現在前后端分離是趨勢,那么對flask進行一定的修改,變為前后端分離,在前端頁面中請求后端,那么請求的格式那么必然會有使用json傳遞數據,然而flask_wtf默認只支持form表單,那么對改動支持json

 

代碼如下:

 1 # coding=utf-8
 2 
 3 from flask import request
 4 from wtforms import Form
 5 from OnlineClassroom.app.err.JsonValidateErr import JsonValidateErr
 6 
 7 
 8 # request data 基礎驗證器
 9 class RequestBaseForm(Form):
10     # 解析請求參數
11     def __init__(self):
12         # todo 做個處理,如果請求進來的請求時form參數則else,如果是json則進行下列操作
13         if "application/json" in request.headers.get("Content-Type"):
14             data = request.get_json(silent=True)
15             args = request.args.to_dict()
16             super(RequestBaseForm, self).__init__(data=data, **args)
17         else:
18             # application/x-www-form-urlencoded    or    multipart/form-data
19             data = request.form.to_dict()
20             args = request.args.to_dict()
21             super(RequestBaseForm, self).__init__(data=data, **args)
22 
23     # 對驗證錯誤的參數拋出異常
24     def validate_for_api(self):
25         valid = super(RequestBaseForm, self).validate()
26         if not valid:
27             # todo 這里做一個返回,code,msg,data 錯誤返回  ???
28             raise JsonValidateErr("field is require?")
29 
30         return self

根據請求header中content-type來對數據解析,調用wtfforms的Form父類方法__init__將解析過后的參數給予父類的屬性,其中自定義方法validate_for_api調用父類的驗證方法validate()由父類來確定是否存在與准確

 

form表單模型:

1 # coding=utf-8
2 
3 from .JsonBaseValidate import RequestBaseForm
4 from wtforms import StringField,Form
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 xx():
3     req = Testform()
4     type = request.headers.get("Content-Type")
5     if req.validate_for_api():
6         return "requset username.data {} >> request context-type {}".format(req.username.data,type)
7     return "request validate failds..."

 

 

 

 這是json請求,不要忘記在header中將content-type的選項改為applocation/json

 

 

 

 

這是form-data和form-urlencoded

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM