Метод on_json_loading_failed
Метод on_json_loading_failed применяется к объекту
запроса request и вызывается автоматически,
когда Flask не может разобрать JSON из тела запроса.
Первым параметром метод принимает исключение,
которое возникло при разборе. По умолчанию метод
возвращает ответ с кодом 400 и сообщением об ошибке.
Переопределив его в подклассе Request, можно
вернуть собственный ответ.
Синтаксис
request.on_json_loading_failed(e)
Пример
Давайте посмотрим, как Flask ведёт себя при отправке некорректного JSON. Создадим приложение с маршрутом, который читает JSON из запроса:
from flask import Flask, request
app = Flask(__name__)
@app.route('/api', methods=['POST'])
def api():
data = request.get_json()
return {'received': data}
Если отправить запрос с телом abcde и заголовком
Content-Type: application/json, то Flask вызовет
on_json_loading_failed и вернёт ошибку:
Bad Request: The browser (or proxy) sent a request that this server could not understand.
Пример
Давайте переопределим метод on_json_loading_failed,
чтобы возвращать собственное JSON-сообщение об ошибке.
Для этого создадим подкласс Request и укажем его
в приложении:
from flask import Flask, request, jsonify
from werkzeug.exceptions import BadRequest
class MyRequest(request.__class__):
def on_json_loading_failed(self, e):
return jsonify({'error': 'invalid json', 'detail': str(e)}), 400
app = Flask(__name__)
app.request_class = MyRequest
@app.route('/api', methods=['POST'])
def api():
data = request.get_json()
return {'received': data}
Теперь при отправке некорректного JSON клиент получит осмысленный ответ:
{"error": "invalid json", "detail": "..."}