Только что открыл ответ сам.
Функции teardown_request
не должны принимать ответ и возвращать ответ, как это делает after_request
. Они, очевидно, принимают аргумент, который обычно равен None
, если только Exception
, который не является производным от HttpException
, не поднимается представлением, и в этом случае им передается это.
Очевидно, они также не должны возвращать указанное исключение, иначе вы получите нарушенное поведение, которое я продемонстрировал.
Чтобы исправить, teardown_request
функции приложения должны выглядеть следующим образом:
@app.teardown_request
def teardown1(exc):
print "Teardown 1 {0!r}".format(exc)
@app.teardown_request
def teardown2(exc):
print "Teardown 2 {0!r}".format(exc)
Что дает ожидаемый результат для всех трех представлений:
Teardown 2 None
Teardown 1 None
127.0.0.1 - - [15/Nov/2011 19:20:03] "GET / HTTP/1.1" 200 -
Teardown 2 None
Teardown 1 None
127.0.0.1 - - [15/Nov/2011 19:20:10] "GET /httpexception HTTP/1.1" 400 -
Teardown 2 Exception('bacoff',)
Teardown 1 Exception('bacoff',)
127.0.0.1 - - [15/Nov/2011 19:20:18] "GET /exception HTTP/1.1" 500 -
(с добавлением некоторой дополнительной отладки для печати того, что передается обработчикам teardown_request
)