2013-05-14 76 views
3

所以我要通過基本瓶教程,並期待在他們的代碼有此片段:現在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」文件時,它將任何裝飾函數與其代碼關聯起來,以便在必要時調用它。我嘗試閱讀很多關於裝飾器的來源,看看我的解釋是錯誤的,但是找不到任何錯誤。

回答

5

正如你可以看到the code,裝飾增添你用它裝飾功能的一個Flask對象實例函數(self.teardown_appcontext_funcs)(你的情況app)的列表。這個列表然後在appcontext被拆除時以相反的順序迭代,每個函數都被傳遞了引發拆卸的異常,或者如果沒有引發任何異常,則返回佔位符異常。這發生在Flask.do_teardown_appcontext()

+0

很好的解釋,一切都有意義。謝謝! – dccarmo 2013-05-14 15:16:56

相關問題