【问题标题】:How does Flask knows which decorated function to call?Flask 如何知道要调用哪个装饰函数?
【发布时间】:2013-05-08 19:07:02
【问题描述】:

所以我正在阅读基本的 Flask 教程,并查看他们的代码,有这个 sn-p:

 @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”文件时,它会将任何修饰函数与其代码相关联,以便在必要时调用它。我尝试阅读很多关于装饰器的资料,看看我的解释是否错误,但找不到任何错误。

【问题讨论】:

    标签: python flask python-decorators


    【解决方案1】:

    正如您在the code 中看到的那样,装饰器将您用它装饰的函数添加到Flask 对象实例(在您的情况下为app)上的函数列表(self.teardown_appcontext_funcs)中。然后,当 appcontext 被拆除时,这个列表会以相反的顺序迭代,每个函数都被传递触发拆除的异常,或者如果没有引发异常,则传递一个占位符异常。这发生在Flask.do_teardown_appcontext()

    【讨论】:

    • 很好的解释,现在一切都说得通了。谢谢!
    猜你喜欢
    • 2014-07-10
    • 2020-11-14
    • 2011-03-21
    • 2020-02-02
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2021-05-19
    • 2019-01-29
    相关资源
    最近更新 更多