使用Factory Pattern访问Flask中的@App装饰器

时间:2018-12-01 00:56:25

标签: flask factory-pattern

如何使用装饰器的工厂模式访问应用程序对象? 我知道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 :(得分:1)

您可以在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