博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask-restful 用法及自定义参数错误信息
阅读量:5948 次
发布时间:2019-06-19

本文共 2996 字,大约阅读时间需要 9 分钟。

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

代码结构:

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

具体代码如下:

parser.pyfrom flask_restful.reqparse import RequestParserparser = RequestParser()parser.add_argument("id", type=int, location="args", required=True)# get 请求为args, post请求为json

在 view 中的使用

view.py

from flask_restful import Resourcefrom app.util import make_resultfrom .parser import parserclass 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 Testfrom flask_restful import Apifrom flask import Blueprintapi = Blueprint("api", __name__) # 设置蓝图resource = Api(api)resource.add_resource(Test, "/") # 设置路由

util.py 为一个设置文件, 用来放我们自己定义的输出规范。

util.py

from flask import jsonifyfrom app.code import Codedef 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.pyfrom flask import Flaskfrom app.api import apiapp = 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, abortimport flask_restfulfrom app.api import apifrom app.util import make_resultfrom app.code import Codeapp = 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_abordif __name__ == "__main__":    app.run(debug=True)

现在再次运行 python app.py

浏览器输入::5000/?id=api

即可得到:

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

输入::5000/?id=111 检测一下正常输出:

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

完美!

转载地址:http://debxx.baihongyu.com/

你可能感兴趣的文章
Spring Session + redis实现session共享
查看>>
阿里云的maven仓库
查看>>
hash table碰撞处理
查看>>
Oracle事务
查看>>
Spark2.0操作ES
查看>>
代码创建UISearchDisplayCountroller
查看>>
Android中的Handler机制
查看>>
揭秘jbpm流程引擎内核设计思想及构架
查看>>
PTSSpringBoard
查看>>
SHSidebarController
查看>>
微信公众号接口添加菜单时错误(errcode":40017 invalid button type)
查看>>
转: Xcode提示“expression is not assignable”
查看>>
nginx笔记
查看>>
浏览器安全-恶意网址拦截
查看>>
C++基础①命名空间结构体和引用
查看>>
在一个数组中搜索是否可以跟给定数组相匹配的键和值并返回
查看>>
如果myeclipse突然报错
查看>>
两个线程的交替运行
查看>>
Jetty之Trie树
查看>>
项目经理笔记一
查看>>