flask-restful 是一款比較好用的 flask 插件,它不只自動爲咱們實現了數據的 json 化,還能對傳入參數進行驗證,優雅的替代了 form 表單。python
代碼結構:json
app |_api | |_ __init__.py | |_ parser.py | |_ view.py | |_ __init__.py |_ code.py |_ util.py app.py
具體代碼以下:flask
parser.py from flask_restful.reqparse import RequestParser parser = RequestParser() parser.add_argument("id", type=int, location="args", required=True) # get 請求爲args, post請求爲json
在 view 中的使用api
view.py瀏覽器
from flask_restful import Resource from app.util import make_result from .parser import parser class Test(Resource): def get(self): req = parser.parse_args(strict=True) id = req.get("id") return make_result(data={"id": id})
還有 __init__.py 文件設置路由restful
__init__.pyapp
from .view import Test from flask_restful import Api from flask import Blueprint api = Blueprint("api", __name__) # 設置藍圖 resource = Api(api) resource.add_resource(Test, "/") # 設置路由
util.py 爲一個設置文件, 用來放咱們本身定義的輸出規範。post
util.pyui
from flask import jsonify from app.code import Code def make_result(data=None, code=Code.SUCCESS): return jsonify({"code": code, "data": data, "msg": Code.msg[code]})
code.py 是咱們自定義的錯誤碼插件
code.py
class Code: SUCCESS = 1200 NO_PARAM = 1300 msg = { SUCCESS: "success", NO_PARAM: "no param" }
app.py 爲啓動文件
app.py from flask import Flask from app.api import api app = Flask(__name__) app.register_blueprint(api) if __name__ == "__main__": app.run(debug=True)
當咱們運行 python app.py 的時候,程序便啓動了起來。
咱們在瀏覽器中輸入:localhost:5000/?id=123
便可看到:
{ "code": 1200, "data":{ "id": 123 }, "msg": "success" }
那當咱們輸入: localhost:5000/?id=api
獲得了:
{ "message":{ "id": "invalid literal for int() with base 10: 'api'" } }
很明顯,咱們指望獲得一個 int 型的 id,這裏給了一個 str 類型的字符串,因而獲得了 status_code 爲 40 0的 response。
咱們確定是但願以咱們本身的定義消息來輸出,即:
{ "code": 1300, "data": null, "msg": "no param" }
flask-restful 並無提供相應的 api,通過查看源碼,發現 flask-restful abort 的代碼是改寫的 flask 的 abort 代碼,因而咱們也改寫 flask-restful 的 abort 代碼。
flask abort 源碼:
def abort(status, *args, **kwargs): return _aborter(status, *args, **kwargs)
很是簡單。
flask-restful 的 abort 源碼:
def abort(http_status_code, **kwargs): try: original_flask_abort(http_status_code) except HTTPException as e: if len(kwargs): e.data = kwargs raise
也是很是的簡單,這裏的 original_flask_abort 即 flask 的 abort。
那如今改代碼就很容易了,只要 http_status_code == 400,那麼就是咱們的參數沒有接受正確,須要爆出格式化之後的錯誤。
在 app.py 中修改:
app.py
from flask import Flask, abort import flask_restful from app.api import api from app.util import make_result from app.code import Code app = Flask(__name__) app.register_blueprint(api) def custom_abord(http_status_code, *args, **kwargs): # 只要http_status_code 爲400, 報參數錯誤 if http_status_code == 400: abort(make_result(code=Code.NO_PARAM)) # 正常返回消息 return abort(http_status_code) # 把flask_restful中的abort方法改成咱們本身定義的方法 flask_restful.abort = custom_abord if __name__ == "__main__": app.run(debug=True)
如今再次運行 python app.py
瀏覽器輸入:http://localhost:5000/?id=api
便可獲得:
{ "code": 1300, "data": null, "msg": "no param" }
輸入:http://localhost:5000/?id=111 檢測一下正常輸出:
{ "code": 1200, "data":{ "id": 111 }, "msg": "success" }
完美!