成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Flask-restful 用法及自定義參數(shù)錯(cuò)誤信息

Dogee / 2153人閱讀

摘要:是我們自定義的錯(cuò)誤碼為啟動(dòng)文件當(dāng)我們運(yùn)行的時(shí)候,程序便啟動(dòng)了起來(lái)。在中修改只要為,報(bào)參數(shù)錯(cuò)誤正常返回消息把中的方法改為我們自己定義的方法現(xiàn)在再次運(yùn)行瀏覽器輸入即可得到輸入檢測(cè)一下正常輸出完美

flask-restful 是一款比較好用的 flask 插件,它不僅自動(dòng)為我們實(shí)現(xiàn)了數(shù)據(jù)的 json 化,還能對(duì)傳入?yún)?shù)進(jìn)行驗(yàn)證,優(yōu)雅的替代了 form 表單。

代碼結(jié)構(gòu):

app
 |_api
 |  |_ __init__.py
 |  |_ parser.py
 |  |_ view.py
 |
 |_ __init__.py
 |_ code.py
 |_ util.py
app.py

具體代碼如下:

parser.py

from flask_restful.reqparse import RequestParser

parser = RequestParser()
parser.add_argument("id", type=int, location="args", required=True)
# get 請(qǐng)求為args, post請(qǐng)求為json

在 view 中的使用

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 文件設(shè)置路由

__init__.py

from .view import Test
from flask_restful import Api
from flask import Blueprint

api = Blueprint("api", __name__) # 設(shè)置藍(lán)圖
resource = Api(api)
resource.add_resource(Test, "/") # 設(shè)置路由

util.py 為一個(gè)設(shè)置文件, 用來(lái)放我們自己定義的輸出規(guī)范。

util.py

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 是我們自定義的錯(cuò)誤碼

code.py

class Code:
    SUCCESS = 1200
    NO_PARAM = 1300

    msg = {
        SUCCESS: "success",
        NO_PARAM: "no param"
    }

app.py 為啟動(dòng)文件

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)

當(dāng)我們運(yùn)行 python app.py 的時(shí)候,程序便啟動(dòng)了起來(lái)。

我們?cè)跒g覽器中輸入:localhost:5000/?id=123

即可看到:

{
"code": 1200,
"data":{
"id": 123
},
"msg": "success"
}

那當(dāng)我們輸入: localhost:5000/?id=api

得到了:

{
"message":{
"id": "invalid literal for int() with base 10: "api""
}
}

很明顯,我們期望得到一個(gè) int 型的 id,這里給了一個(gè) str 類(lèi)型的字符串,于是得到了 status_code 為 40 0的 response。

我們肯定是希望以我們自己的定義消息來(lái)輸出,即:

{
"code": 1300,
"data": null,
"msg": "no param"
}

flask-restful 并沒(méi)有提供相應(yīng)的 api,經(jīng)過(guò)查看源碼,發(fā)現(xiàn) flask-restful abort 的代碼是改寫(xiě)的 flask 的 abort 代碼,于是我們也改寫(xiě) flask-restful 的 abort 代碼。

flask abort 源碼:

def abort(status, *args, **kwargs):
    return _aborter(status, *args, **kwargs)

非常簡(jiǎn)單。

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

也是非常的簡(jiǎn)單,這里的 original_flask_abort 即 flask 的 abort。

那現(xiàn)在改代碼就很容易了,只要 http_status_code == 400,那么就是我們的參數(shù)沒(méi)有接受正確,需要爆出格式化以后的錯(cuò)誤。

在 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, 報(bào)參數(shù)錯(cuò)誤
    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)

現(xiàn)在再次運(yùn)行 python app.py

瀏覽器輸入:http://localhost:5000/?id=api

即可得到:

{
"code": 1300,
"data": null,
"msg": "no param"
}

輸入:http://localhost:5000/?id=111 檢測(cè)一下正常輸出:

{
"code": 1200,
"data":{
"id": 111
},
"msg": "success"
}

完美!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44530.html

相關(guān)文章

  • Flask 擴(kuò)展系列之 Flask-RESTful

    摘要:勵(lì)以最少的安裝方式進(jìn)行最佳實(shí)踐。上面的例子接收了一個(gè)對(duì)象并準(zhǔn)備將其序列化。裝飾器會(huì)通過(guò)進(jìn)行轉(zhuǎn)換。從對(duì)象中提取的唯一字段是。是一個(gè)特殊的字段,它接受端點(diǎn)名稱并為響應(yīng)中的端點(diǎn)生成一個(gè)??梢圆榭错?xiàng)查看完整列表。 大綱 簡(jiǎn)介 安裝 快速入門(mén) 一個(gè)最小的 api 例子 資源豐富的路由 端點(diǎn) 參數(shù)解析 數(shù)據(jù)格式化 完整 TODO 應(yīng)用例子 簡(jiǎn)介 Flask-RESTful是一個(gè)Flas...

    阿羅 評(píng)論0 收藏0
  • PHP 錯(cuò)誤拋出及自定義處理

    摘要:錯(cuò)誤拋出及自定義處理定義中的錯(cuò)誤拋出及自定義處理指的是允許我們自定義拋出錯(cuò)誤并且捕捉錯(cuò)誤并進(jìn)行處理。例如我們編寫(xiě)一個(gè)的函數(shù),而參數(shù)必須是一個(gè)整數(shù)否則觸發(fā)錯(cuò)誤運(yùn)行結(jié)果如下捕捉錯(cuò)誤異常摘自官方文檔 PHP 錯(cuò)誤拋出及自定義處理 定義 php中的錯(cuò)誤拋出及自定義處理指的是允許我們自定義拋出錯(cuò)誤并且捕捉錯(cuò)誤并進(jìn)行處理。類(lèi)似于 面向?qū)ο笳Z(yǔ)言中的throw 及 try...catch... 在ph...

    2450184176 評(píng)論0 收藏0
  • H5頁(yè)面二次分享

    摘要:對(duì)于頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。通篇看完的話,基本上能避過(guò)很多坑記得微信文檔習(xí)慣把一些坑寫(xiě)在后面,不放在一起先說(shuō)說(shuō),怎么微信怎么做二次分享文檔地址,通過(guò)引入官方。 對(duì)于H5頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟qq還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。和PC端不同,PC直接復(fù)制地址了。前兩天在做請(qǐng)柬,踩了不少的雷,個(gè)人開(kāi)發(fā)和公司開(kāi)...

    evin2016 評(píng)論0 收藏0
  • H5頁(yè)面二次分享

    摘要:對(duì)于頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。通篇看完的話,基本上能避過(guò)很多坑記得微信文檔習(xí)慣把一些坑寫(xiě)在后面,不放在一起先說(shuō)說(shuō),怎么微信怎么做二次分享文檔地址,通過(guò)引入官方。 對(duì)于H5頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟qq還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。和PC端不同,PC直接復(fù)制地址了。前兩天在做請(qǐng)柬,踩了不少的雷,個(gè)人開(kāi)發(fā)和公司開(kāi)...

    layman 評(píng)論0 收藏0
  • 使用 Flask 和 AngularJS 構(gòu)建博客 - 1

    摘要:注原文作者,原文地址為在這個(gè)教程中,我們將使用和構(gòu)建一個(gè)博客。在開(kāi)發(fā)期間,這將允許我們把它們運(yùn)行在不同的端口例如和?,F(xiàn)在我們將進(jìn)入目錄并使用運(yùn)行這個(gè)腳本。示例創(chuàng)建一篇文章為了創(chuàng)建一篇文章,你需要發(fā)送一個(gè)請(qǐng)求給。 注:原文作者 John Kevin M. Basco,原文地址為 Building a blog using Flask and AngularJS Part 1 在...

    劉玉平 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Dogee

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<