как не сломать сервер flask при возникновении ошибки? - PullRequest
0 голосов
/ 17 января 2020

Я создал приложение API, используя flask, которое принимает число (десятичное) в качестве входных данных и возвращает некоторую строку. Это приложение ломается, если я отправляю строку и работает нормально после его перезапуска. Я не хочу перезапускать каждый раз, когда происходит какая-либо ошибка во время обработки. Как мне это сделать?

Вот мой код:

from flask import Flask, request, jsonify

# initiating the app
flask_api_app = Flask(__name__)


# the app accepts requests via "GET" and "POST" methods
@flask_api_app.route("/", methods=["GET", "POST"])
def output_risk_and_report():
    # getting json data from api call
    json_data = request.get_json(force=True)

    # now the processing part
    if json_data['number'] < 2:
        return jsonify(["the number is less than two"])
    else:
        return jsonify(["the number is not less than two"])


# main function, in which app will be run
if __name__ == "__main__":
    # running the app on local host
    flask_api_app.run(debug=True, host='127.0.0.1', port='8080')

пример вызова, который не ломает приложение: {"number":4}
пример вызова, который ломает приложение: {"number":"adfa"}

Какие изменения я внесу в свой код для выполнения sh this?

EDIT 1: Я был наивен, чтобы привести этот пример в своем вопросе. в моей исходной программе я могу получить ошибку при вставке данных в базу данных или получить ошибку с некоторым вычислением арифметики c или чем-то еще. Итак, есть ли способ сказать flask продолжать обслуживать новые запросы API и не прерывать работу при возникновении ошибки только с одним вызовом API.

Ответы [ 3 ]

1 голос
/ 17 января 2020

Вы можете создать декоратор, который будет глобальным обработчиком исключений:

import traceback
from flask import current_app

def set_global_exception_handler(app):
    @app.errorhandler(Exception)
    def unhandled_exception(e):
        response = dict()
        error_message = traceback.format_exc()
        app.logger.error("Caught Exception: {}".format(error_message)) #or whatever logger you use
        response["errorMessage"] = error_message
        return response, 500

И где бы вы ни создавали свой экземпляр приложения, вы должны делать это:

from xxx.xxx.decorators import set_global_exception_handler
app = Flask(__name__)
set_global_exception_handler(app)

Это будет обрабатывать все исключения, сгенерированные в вашем приложении, и все, что вам нужно для их обработки. Надеюсь, это поможет.

1 голос
/ 17 января 2020

Вам необходимо инициировать возврат с сообщением об ошибке, если все, что отправляет пользователь, не может быть выражено как целое число.

Следующее должно работать для представлений, таких как 3 и '3'

    # now the processing part
    try:
        number = int(json_data['number'])
    except ValueError:
        return jsonify(['Invalid submission'])

    # Number is now type integer

    if number < 2:
        return jsonify(["the number is less than two"])
    else:
        return jsonify(["the number is not less than two"])
0 голосов
/ 17 января 2020

При просмотре документов мы можем обнаружить следующее:

handle_exception (e)

Обрабатывать исключение, с которым не связан обработчик ошибок с этим, или это было поднято из обработчика ошибок. Это всегда вызывает 500 InternalServerError.

Всегда отправляет сигнал got_request_exception.

Если тип пропагата равен True, например, в режиме отладки, ошибка будет повторно вызвана, чтобы отладчик мог отобразить ее , В противном случае регистрируется исходное исключение и возвращается InternalServerError.

Если обработчик ошибок зарегистрирован для InternalServerError или 500, он будет использоваться. Для согласованности обработчик всегда получит InternalServerError. Исходное необработанное исключение доступно как e.original_exception.

Способ отловить эти ошибки и сделать что-то с ними может быть следующим:

@app.errorhandler(Exception)
def handle_exception(e):
    # pass through HTTP errors
    if isinstance(e, HTTPException):
        return e

    # now you're handling non-HTTP exceptions only
    return render_template("500_generic.html", e=e), 500

Источник и дополнительная документация при необходимости Вы можете найти здесь:

Flask проекты поддонов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...