#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
Надеюсь, это поможет!