Flask-restful 用法及自定義參數錯誤信息

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"
}

完美!

相關文章
相關標籤/搜索