Доступ к декоратору @App во Flask с использованием Factory Pattern - PullRequest
0 голосов
/ 01 декабря 2018

Как получить доступ к объекту приложения, используя фабричный шаблон для декораторов?Я знаю, что current_app существует, но я не могу использовать это для декораторов.

Перед использованием заводского шаблона (например, обертывание инициализации приложения и регистрация чертежа в функции) я мог бы просто сделать что-то вроде:

@app.errorhandler(500)
@app.errorhandler(502)
def generic_errror_handler(error):
    # Some logic here
    return render_template('error.html', error=errror)

Но после использования заводского шаблона я не вижу, как этого добиться хорошим способом.Вы инициализируете их внутри функции create_app ()?

def create_app():
    app = Flask(__name__)
    initialize_extensions(app)
    register_blueprints(app)
    return app

1 Ответ

0 голосов
/ 01 декабря 2018

Вы можете инициализировать обработчики в определении create_app, например,

def create_app():
    app = Flask(__name__)
    initialize_extensions(app)
    register_blueprints(app)

    @app.errorhandler(500)
    @app.errorhandler(502)
    def generic_errror_handler(error):
        # Some logic here
        return render_template('error.html', error=errror)

    return app

или создать отдельный файл Python, например error_handlers.py (пример взят из Quokka CMS ):

def register_handlers(app):
    if app.config.get('DEBUG') is True:
        app.logger.debug('Skipping error handlers in Debug mode')
        return

    @app.errorhandler(403)
    def forbidden_page(*args, **kwargs):
        # do stuff
        return render_template("errors/access_forbidden.html"), 403

    @app.errorhandler(404)
    def page_not_found(*args, **kwargs):
        # do stuff
        return render_template("errors/page_not_found.html"), 404

    @app.errorhandler(405)
    def method_not_allowed_page(*args, **kwargs):
        # do stuff
        return render_template("errors/method_not_allowed.html"), 405

    @app.errorhandler(500)
    def server_error_page(*args, **kwargs):
        # do stuff
        return render_template("errors/server_error.html"), 500

и звоните register_handlers из create_app:

def create_app():
    app = Flask(__name__)
    initialize_extensions(app)
    register_blueprints(app)

    register_handlers(app)

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