资讯专栏INFORMATION COLUMN

Flask-restful 用法及自定义参数错误信息

Dogee / 1920人阅读

摘要:是我们自定义的错误码为启动文件当我们运行的时候,程序便启动了起来。在中修改只要为,报参数错误正常返回消息把中的方法改为我们自己定义的方法现在再次运行浏览器输入即可得到输入检测一下正常输出完美

flask-restful 是一款比较好用的 flask 插件,它不仅自动为我们实现了数据的 json 化,还能对传入参数进行验证,优雅的替代了 form 表单。

代码结构:

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 请求为args, post请求为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 文件设置路由

__init__.py

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 为一个设置文件, 用来放我们自己定义的输出规范。

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 是我们自定义的错误码

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

完美!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44530.html

相关文章

  • Flask 扩展系列之 Flask-RESTful

    摘要:励以最少的安装方式进行最佳实践。上面的例子接收了一个对象并准备将其序列化。装饰器会通过进行转换。从对象中提取的唯一字段是。是一个特殊的字段,它接受端点名称并为响应中的端点生成一个。可以查看项查看完整列表。 大纲 简介 安装 快速入门 一个最小的 api 例子 资源丰富的路由 端点 参数解析 数据格式化 完整 TODO 应用例子 简介 Flask-RESTful是一个Flas...

    阿罗 评论0 收藏0
  • PHP 错误抛出及自定义处理

    摘要:错误抛出及自定义处理定义中的错误抛出及自定义处理指的是允许我们自定义抛出错误并且捕捉错误并进行处理。例如我们编写一个的函数,而参数必须是一个整数否则触发错误运行结果如下捕捉错误异常摘自官方文档 PHP 错误抛出及自定义处理 定义 php中的错误抛出及自定义处理指的是允许我们自定义抛出错误并且捕捉错误并进行处理。类似于 面向对象语言中的throw 及 try...catch... 在ph...

    2450184176 评论0 收藏0
  • H5页面二次分享

    摘要:对于页面来说二次分享还是蛮重要的,毕竟还是微信发出去之后习惯性的使用自带的分享功能。通篇看完的话,基本上能避过很多坑记得微信文档习惯把一些坑写在后面,不放在一起先说说,怎么微信怎么做二次分享文档地址,通过引入官方。 对于H5页面来说二次分享还是蛮重要的,毕竟qq还是微信发出去之后习惯性的使用自带的分享功能。和PC端不同,PC直接复制地址了。前两天在做请柬,踩了不少的雷,个人开发和公司开...

    evin2016 评论0 收藏0
  • H5页面二次分享

    摘要:对于页面来说二次分享还是蛮重要的,毕竟还是微信发出去之后习惯性的使用自带的分享功能。通篇看完的话,基本上能避过很多坑记得微信文档习惯把一些坑写在后面,不放在一起先说说,怎么微信怎么做二次分享文档地址,通过引入官方。 对于H5页面来说二次分享还是蛮重要的,毕竟qq还是微信发出去之后习惯性的使用自带的分享功能。和PC端不同,PC直接复制地址了。前两天在做请柬,踩了不少的雷,个人开发和公司开...

    layman 评论0 收藏0
  • 使用 Flask 和 AngularJS 构建博客 - 1

    摘要:注原文作者,原文地址为在这个教程中,我们将使用和构建一个博客。在开发期间,这将允许我们把它们运行在不同的端口例如和。现在我们将进入目录并使用运行这个脚本。示例创建一篇文章为了创建一篇文章,你需要发送一个请求给。 注:原文作者 John Kevin M. Basco,原文地址为 Building a blog using Flask and AngularJS Part 1 在...

    刘玉平 评论0 收藏0

发表评论

0条评论

Dogee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<