2013-05-14 3 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() 

Он по-прежнему работает. Как Флакс управляет этим?

Я предполагаю, что когда я запускаю файл «flaskr.py» со всем основным кодом, он связывает любую украшенную функцию своим кодом, чтобы вызвать ее, когда это необходимо. Я пробовал читать много источников о декораторе, чтобы понять, не ошибается ли моя интерпретация, но не смог найти никакой ошибки.

ответ

5

Как вы можете видеть в the code, декоратор добавляет функцию вы декорировать с ним списком функций (self.teardown_appcontext_funcs) на экземпляре Flask объекта (app в вашем случае). Этот список затем перебирается в обратном порядке, когда appcontext срывается, причем каждой функции передается исключение, вызывающее отрыв, или исключение заполнителя, если никто не был поднят. Это происходит в Flask.do_teardown_appcontext().

+0

Отличное объяснение, все имеет смысл сейчас. Благодаря! – dccarmo