2012-09-05 11 views
12

Qual è un buon modo per calcolare il tempo di esecuzione per ogni caricamento della pagina utilizzando la libreria di Python's Flask?Calcola il tempo di esecuzione per ogni pagina in Python's Flask

Stavo pensando di mettere un timer partenza in vista/__ init__.py:

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

Ma dove avrei messo la parte terminale del timer per calcolare la differenza, e come avrei ottenuto in il piè di pagina del mio modello html?

Grazie.

risposta

11

Mettetela in teardown_request funzione:

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

In teardown_request non ti è permesso di cambiare la risposta, se si desidera utilizzare la stringa calcolata nella vostra risposta utilizzare 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

Come ottengo da lì nel mio modello? Non è che dopo tutto il rendering è finito? – ensnare

+1

ensnare - Il modello di rendering dopo aver calcolato il tempo non è una buona idea, perché in questo modo si ignora il tempo di rendering, ma controlla il mio aggiornamento per sapere come aggiungere tempo calcolato alla risposta. – MostafaR

+1

Ho inserito g.start = time.time() nella mia funzione before_request() e il codice nella funzione after_request(). Ma quando lo faccio, after_request() non può vedere g.start. Ottengo l'errore: l'oggetto '_RequestGlobals' non ha attributo 'start' – ensnare

2

È inoltre è necessario aggiornare l'intestazione della lunghezza del contenuto, altrimenti i browser si arrabbiano (e Chrome sembra dare risultati imprevedibili).

@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

ho avuto "errore di tubo rotto" servire i file statici con la risposta di Peter Farmer, e problemi con reindirizzamento HTTP (301), così ho messo a punto il codice fornito, se aiuta.

@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 
Problemi correlati