Python Flask如何知道调用哪个修饰函数?

Python Flask如何知道调用哪个修饰函数?,python,flask,python-decorators,Python,Flask,Python Decorators,我正在学习基本的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(

我正在学习基本的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”文件时,它会将任何修饰过的函数与其代码关联起来,以便在必要时调用它。我试着阅读了很多关于decorator的资料,看看我的解释是否有误,但没有发现任何错误。

正如您在中所看到的,decorator将您用它装饰的函数添加到
Flask
对象实例(
app
)上的函数列表(
self.teardown\u appcontext\u funcs
)中。当appcontext被分解时,该列表将以相反的顺序迭代,每个函数都会被传递一个触发分解的异常,如果没有引发任何异常,则传递一个占位符异常。这发生在Flask.do_teardown_appcontext()

很好的解释,现在一切都有意义了。谢谢