【问题标题】:Access @App decorator in Flask using Factory Pattern使用工厂模式访问 Flask 中的 @App 装饰器
【发布时间】:2018-12-01 00:56:25
【问题描述】:

如何使用装饰器的工厂模式访问 app 对象? 我知道 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

【问题讨论】:

    标签: flask factory-pattern


    【解决方案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
    

    并从create_app 内部调用register_handlers

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

    【讨论】:

    • 也可以在模块上定义没有装饰器的函数,在创建应用程序后简单地装饰它。例如app.errorhanlder(404)(page_not_found)
    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2015-03-12
    • 2020-09-26
    • 2013-05-07
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多