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