Повторное использование шаблонного кода во фляжных приложениях

У меня есть некоторые вызовы обработки ошибок во многих моих флажковых приложениях. Например, мой ответ 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

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

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


person Adam Matan    schedule 01.07.2014    source источник
comment
Возможно, вы могли бы написать шаблонное расширение фляги? flask.pocoo.org/docs/extensiondev   -  person msvalkon    schedule 01.07.2014


Ответы (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)
person Martijn Pieters    schedule 01.07.2014
comment
Спасибо! приятно видеть тебя снова. Если я правильно вас понимаю, это решение применимо только к обработке ошибок, а не к другим служебным функциям (например, в вашем предыдущем ответе Будут ли чертежи решением этой проблемы? - person Adam Matan; 01.07.2014
comment
@AdamMatan: декораторы в этом ответе можно использовать где угодно. Их уже можно использовать повторно. - person Martijn Pieters; 01.07.2014
comment
Это означает, что я могу поместить их в схему и зарегистрировать в другом месте приложения? - person Adam Matan; 01.07.2014
comment
@AdamMatan: Blueprints можно использовать для добавления фильтров шаблонов, глобальных шаблонов, тестов шаблонов, перехватчиков запросов, обработчиков контекста, URL-адресов по умолчанию и т. д. и т. д. - person Martijn Pieters; 01.07.2014
comment
@AdamMatan: почти все, что вы обычно регистрируете в приложении, также можно зарегистрировать в схеме, чтобы применять либо только к маршрутам в схеме, либо ко всему (всему, что имеет app_ в названии применяется ко всем маршрутам везде). - person Martijn Pieters; 01.07.2014
comment
Спасибо. Это кажется очень полезным инструментом - начал читать документацию. - person Adam Matan; 01.07.2014