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()

+0

很好的解释,一切都有意义。谢谢! – dccarmo 2013-05-14 15:16:56