Flask如何知道要调用哪个装饰函数?
问题描述:
所以我要通过基本瓶教程,并期待在他们的代码有此片段:现在Flask如何知道要调用哪个装饰函数?
@app.teardown_appcontext
def close_db_connection(exception):
"""Closes the database again at the end of the request."""
top = _app_ctx_stack.top
if hasattr(top, 'sqlite_db'):
top.sqlite_db.close()
,为我自己的手册中读过,函数“app.teardown_appcontext”之称每当一个回调有意想不到的行为。使用它来装饰功能可以让您将功能添加到原始功能。或者至少这是我从装饰者了解到的。但是,如果我这样做:
@app.teardown_appcontext
def stack_overflow_rocks(exception):
"""Closes the database again at the end of the request."""
top = _app_ctx_stack.top
if hasattr(top, 'sqlite_db'):
top.sqlite_db.close()
它仍然有效。 Flask如何管理这个?
我的猜测是,当我运行带有所有主代码的“flaskr.py”文件时,它将任何装饰函数与其代码关联起来,以便在必要时调用它。我尝试阅读很多关于装饰器的来源,看看我的解释是错误的,但是找不到任何错误。
答
正如你可以看到the code,装饰增添你用它装饰功能的一个Flask
对象实例函数(self.teardown_appcontext_funcs
)(你的情况app
)的列表。这个列表然后在appcontext被拆除时以相反的顺序迭代,每个函数都被传递了引发拆卸的异常,或者如果没有引发任何异常,则返回占位符异常。这发生在Flask.do_teardown_appcontext()
。
很好的解释,一切都有意义。谢谢! – dccarmo 2013-05-14 15:16:56