Настройте Flask-Restful API на спецификацию JSON API - PullRequest
0 голосов
/ 29 октября 2018

Я создал небольшой API-интерфейс Flask-Restful только с одним методом. Мой 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 :

Включение клавиши «status» установит код статуса Ответа. Если не указано, что по умолчанию будет 500.

Содержание ошибки:

{"message": "Internal Server Error"}

Когда я искал об этом, я обнаружил , что можно определить dict, содержащий каждую ошибку, и передать его объекту 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
    }
}

1 Ответ

0 голосов
/ 29 октября 2018

В вашем словаре с ошибками вы используете ключ INVALID_FIELD. Однако вы не можете выбрать это значение самостоятельно. Если вы посмотрите документацию werkzeug https://werkzeug -docs-cn.readthedocs.io / zh_CN / latest / exceptions.html , вы увидите, что каждое исключение является классом.

Таким образом, вместо INVALID_FIELD следует использовать BadRequest, имя класса, соответствующего коду ошибки 400.

...