Возвращает JSON с обработчиком ошибок в облачной функции Python

#python #flask #google-cloud-platform #google-cloud-functions

#python #flask #google-облачная платформа #google-cloud-функции

Вопрос:

Я использую Python для облачной функции HTTP и хочу установить обработчик ошибок по умолчанию для возврата JSON вместо HTML.

 from flask_expects_json import expects_json
import payment_orders_schema
from flask import jsonify, Flask

schema = payment_orders_schema.schema

app = Flask(__name__)


@app.errorhandler(400)
def bad_request(error):
    return jsonify({'error': error.description}), 400


@expects_json(schema)
def add_payment_order(request, methods=['POST']):

    request_json = request.get_json(silent=True)

    if request_json:
        return jsonify(request_json), 200

  

Во-первых, я не уверен, смогу ли я определить app переменную в облачной функции, а во-вторых, @app.errorhandler не работает, облачные функции возвращают HTML.

Есть идеи?

Ответ №1:

Во-первых, я не уверен, смогу ли я определить app переменную в облачной функции

Вы не можете. Хотя Cloud Functions использует Flask для обслуживания запросов под капотом, он не поддерживает настройку вашего собственного Flask WSGI app , как вы делаете здесь.

Однако вы сможете развернуть это как есть в стандартной среде выполнения Python 3.7 App Engine. Возможно, вы захотите рассмотреть возможность сделать это вместо этого.

Комментарии:

1. Спасибо! Это то, чего я ожидал!

2. Привет, Дастин, я пересматриваю это и просто задаюсь вопросом.. почему среда выполнения nodejs позволяет вам управлять приложением Express и определять пользовательские маршруты, например, а среда выполнения python — нет? Я создаю restful API с помощью GCF и задаюсь вопросом, как лучше всего обрабатывать URL, например resource/:id/resource2

Ответ №2:

Вместо того, чтобы перехватывать 400 ошибку, которая является BAD REQUEST ошибкой, возможно, вы могли бы попробовать перехватить 404 ошибку, которая является NOT FOUND ошибкой. Я думаю, это то, что вы действительно хотите сделать, поскольку 404 ошибка типа — это то, что получается, когда пользователь пытается перейти на страницу вашего сайта, которая не существует. Попробуйте изменить свой обработчик ошибок на следующий и посмотрите, поможет ли это:

 @app.errorhandler(404)
def error_404(error):
    return jsonify({'error': error.description}), 404
  

Надеюсь, это поможет!