使用工厂模式访问 Flask 中的@App 装饰器
Access @App decorator in Flask using Factory Pattern
如何使用装饰器的工厂模式访问应用程序对象?
我知道 current_app 存在,但我不能将其用于装饰器。
在使用工厂模式之前(例如,将 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
您可以在 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
如何使用装饰器的工厂模式访问应用程序对象? 我知道 current_app 存在,但我不能将其用于装饰器。
在使用工厂模式之前(例如,将 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
您可以在 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