2011-11-15 25 views
8

ứng dụng đơn giản này, có hai teardown_request xử lý, và tôi mong đợi cả hai người trong số họ được kêu gọi mọi yêu cầu, không có vấn đề gì xảy ra trong việc thực hiện xem, theo documentationTại sao chỉ có một chức năng Flask teardown_request được gọi khi xem tăng ngoại lệ?

import flask 
import werkzeug.exceptions 

app = flask.Flask(__name__) 

@app.teardown_request 
def teardown1(response): 
    print "Teardown 1" 
    return response 

@app.teardown_request 
def teardown2(response): 
    print "Teardown 2" 
    return response 

@app.route("/") 
def index(): 
    return "chunky bacon" 

@app.route("/httpexception") 
def httpexception(): 
    raise werkzeug.exceptions.BadRequest("no bacon?") 

@app.route("/exception") 
def exception(): 
    raise Exception("bacoff") 

if __name__ == "__main__": 
    app.run(port=5000) 

Tuy nhiên, khi tôi chạy nó và đưa ra yêu cầu với ba quan điểm ngược lại, tôi nhận được đầu ra sau đây:

 
Teardown 2 
Teardown 1 
127.0.0.1 - - [15/Nov/2011 18:53:16] "GET/HTTP/1.1" 200 - 

Teardown 2 
Teardown 1 
127.0.0.1 - - [15/Nov/2011 18:53:27] "GET /httpexception HTTP/1.1" 400 - 

Teardown 2 
127.0.0.1 - - [15/Nov/2011 18:53:33] "GET /exception HTTP/1.1" 500 - 

Chỉ một trong những teardown_request chức năng đang được gọi khi một ngoại lệ mà không có nguồn gốc từ werkzeug.exceptions.HTTPException được nâng lên bởi quan điểm cuối cùng. Bất kỳ ý tưởng tại sao, hoặc là một lỗi trong bình?

Trả lời

20

Vừa khám phá câu trả lời.

Các chức năng teardown_request không được phép trả lời và trả lời phản hồi, cách after_request thực hiện. Họ dường như có một đối số thường là None trừ khi một số Exception không lấy được từ số HttpException được hiển thị bởi chế độ xem, trong trường hợp này, chúng được chuyển qua đó.

Rõ ràng họ cũng không được trả về ngoại lệ hoặc bạn sẽ nhận được hành vi bị hỏng mà tôi đã trình bày.

Để khắc phục, teardown_request chức năng của ứng dụng sẽ trông như thế này:

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

Mà sau đó cung cấp cho các đầu ra dự kiến ​​cho tất cả ba quan điểm:

 
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 - 

(với việc bổ sung một số debug thêm để in những gì được chuyển tới trình xử lý teardown_request)

+3

+1 - cũng xin cảm ơn bạn đã đăng câu trả lời! –

Các vấn đề liên quan