2012-09-05 72 views
12

使用Python的Flask庫計算每個頁面加載的執行時間的好方法是什麼?計算Python Flask中每個頁面的執行時間

我想將啓動計時器的意見/ __ init__.py:

@app.before_request 
def before_request(): 
    g.start = time.time() 

但是,在我把定時器的端部來計算的區別,我怎麼會讓它進入我的html模板的頁腳?

謝謝。

回答

11

放入teardown_request功能:你不許

@app.teardown_request 
def teardown_request(exception=None): 
    diff = time.time() - g.start 
    ... 

teardown_request改變的反應,如果你想用計算出的字符串中的響應使用after_request

@app.after_request 
def after_request(response): 
    diff = time.time() - g.start 
    if (response.response): 
     response.response[0] = response.response[0].replace('__EXECUTION_TIME__', str(diff)) 
    return response 
+0

如何從那裏將它從我的模板中取出?不是所有的渲染都完成了嗎? – ensnare

+1

ensnare - 在計算時間之後呈現模板並不是一個好主意,因爲您正在以這種方式忽略呈現時間,但請檢查我的更新以瞭解如何將計算出的時間添加到響應中。 – MostafaR

+1

我把g.start = time.time()放在了我的before_request()函數中,而你的代碼放在了after_request()函數中。但是當我這樣做時,after_request()不能看到g.start。我得到錯誤:'_RequestGlobals'對象沒有屬性'開始' – ensnare

2

你還需要更新內容長度標題,否則瀏覽器會變得不安(Chrome似乎會給出不可預知的結果)。

@app.after_request 
def after_request(response): 
    diff = time.time() - g.start 
    if app.debug: 
     print "Exec time: %s" % str(diff) 

    if (response.response): 
     response.response[0] = response.response[0].replace('__EXECUTION_TIME__', str(diff)) 
     response.headers["content-length"] = len(response.response[0]) 

    return response 
1

我不得不「斷管的錯誤」的服務與彼得農民的回答靜態文件和問題重定向(HTTP 301),所以我調整所提供的代碼,如果它幫助。

@app.after_request 
def after_request(response): 
    diff = int((time.time() - g.start) * 1000) # to get a time in ms 

    if (response.response and response.content_type.startswith("text/html") and response.status_code==200): 
     response.response[0] = response.response[0].replace('__EXECUTION_TIME__', str(diff)) 

    return response