Настройте API Flask-Restful в соответствии со спецификацией API JSON.

Я создал небольшой 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, как описано в документы:

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

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

{"message": "Internal Server Error"}

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

person Kfcaio    schedule 29.10.2018    source источник


Ответы (1)


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

Поэтому вместо INVALID_FIELD вы должны использовать BadRequest, имя класса, которое соответствует коду ошибки 400.

person Tristan    schedule 29.10.2018