Повторное использование стандартного кода в колбах

У меня есть некоторые ошибки обработки вызовов во многих моих приложениях колбу. Например, мой 404 ответ определяется с помощью @app.errorhandler декоратор:

@app.errorhandler(404)
def page_not_found(e):
    return jsonify({'status': 'error',
                    'reason': '''There's no API call for %s''' % request.base_url,
                    'code': 404}), 404

Поскольку у меня есть значительный объем стандартного кода, я хотел бы поместить его в общий файл и наследовать или импортировать мое приложение-колбу из одного места.

Можно ли унаследовать или импортировать код шаблона колбы из другого модуля?

1 ответ

Решение

Конечно, есть, но вам нужно параметризовать регистрации.

Вместо использования декораторов перенесите регистрацию в функцию:

def page_not_found(e):
    return jsonify({'status': 'error',
                    'reason': '''There's no API call for %s''' % request.base_url,
                    'code': 404}), 404


def register_all(app):
    app.register_error_handler(404, page_not_found)

затем импортировать register_all и позвони со своим Flask() объект.

Это использует Flask.register_error_handler() функция вместо декоратора.

Чтобы поддерживать чертежи, вам нужно дождаться следующего выпуска Flask (в том числе этот коммит) или напрямую использовать функцию декоратора:

app_or_blueprint.errorhandler(404)(page_not_found)

Для многих из этих задач вы также можете использовать Blueprint при условии, что вы используете Blueprint.app_errorhandler():

common_errors = Blueprint('common_errors')


@common_errors.errorhandler(404)    
def page_not_found(e):
    return jsonify({'status': 'error',
                    'reason': '''There's no API call for %s''' % request.base_url,
                    'code': 404}), 404

Blueprint может обрабатывать не все, но если все, что вы регистрируете, это обработчики ошибок, Blueprint - хороший подход.

Импортируйте проект как обычно и зарегистрируйте его в своем приложении:

from yourmodule import common_errors
app.register_blueprint(common_errors)
Другие вопросы по тегам