【问题标题】:Adjust Flask-Restful API to JSON API specification将 Flask-Restful API 调整为 JSON API 规范
【发布时间】:2019-04-02 09:12:21
【问题描述】:

我只用一种方法构建了一个小型 Flask-Restful API。我的 API 接收一个单词和一个 URL 列表,并返回每个 URL 给定单词的出现次数。

from flask import Flask, request, jsonify
from flask_restful import Resource, Api
import sys
sys.path.append("..")

from word_count import WordCount


app = Flask(__name__)
api = Api(app=app)

class WordApp(Resource):
    def get(self):
        word = request.args.get('word')
        url = request.args.get('url').split(",")
        return {'data': WordCount(url, word).count_words()}


api.add_resource(WordApp, '/')

if __name__ == '__main__':
    app.run(debug=False)

如果请求的资源调用成功,返回的内容是

{"data": {"foo": {"http://www.foobar.com": 42}}}

虽然,如果请求调用不成功,返回的内容不符合JSON API,如docs所述:

包含“状态”键将设置响应的状态代码。如果不 指定它将默认为 500。

错误内容:

{"message": "Internal Server Error"}

当我搜索它时,我发现that 可以定义一个包含每个错误的字典并将其传递给 Api 对象。

errors = {
    'INVALID_FIELD': {
        'message': "Missing or invalid field",
        'status': 400
    }
}

app = Flask(__name__)
api = flask_restful.Api(app, errors=errors)

但是,使用 Postman 使用以下设置测试我的端点时,会返回相同的 500 错误消息。我认为我在实现中遗漏了一些东西,以便返回我的自定义错误消息。

http://127.0.0.1:5000/?word=to

我想根据 JSON API 规范返回正确的自定义错误消息,如下所示:

{
    "error": {
        "message": "Missing or invalid field",
        "code": 400
    }
}

【问题讨论】:

    标签: python json rest flask flask-restful


    【解决方案1】:

    在您的字典中有错误时,您使用密钥INVALID_FIELD。但是,您不能自己选择此值。如果您查看 werkzeug 文档 https://werkzeug-docs-cn.readthedocs.io/zh_CN/latest/exceptions.html,您会发现每个异常都是一个类。

    所以你应该使用BadRequest,而不是INVALID_FIELD,它是对应于错误代码400的类的名称。

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 2021-04-26
      • 2013-11-07
      • 1970-01-01
      • 2015-12-19
      • 2021-10-02
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多