2012-09-05 12 views
12

¿Cuál es una buena forma de calcular el tiempo de ejecución para cada carga de página usando la biblioteca de Flask de Python?Calcular el tiempo de ejecución para cada página en el Frasco de Python

Estaba pensando en poner un temporizador de arranque en vistas/__ init__.py:

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

Pero dónde voy a poner la parte final del contador de tiempo para el cálculo de la diferencia, y cómo iba a conseguirlo en el pie de página de mi plantilla html?

Gracias.

Respuesta

11

Póngalo en teardown_request función:

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

En teardown_request no se le permite cambiar la respuesta, si desea utilizar la cadena calculados en su respuesta utilice 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

¿Cómo puedo obtenerlo desde allí en mi plantilla? ¿No es eso después de que todo el renderizado haya terminado? – ensnare

+1

ensnare: la plantilla de representación después de calcular el tiempo no es una buena idea, porque ignoras el tiempo de renderizado de esta manera, pero verifica mi actualización para saber cómo agregar el tiempo calculado a la respuesta. – MostafaR

+1

Pongo g.start = time.time() en mi función before_request() y su código en la función after_request(). Pero cuando lo hago, after_request() no puede ver g.start. Me sale el error: el objeto '_RequestGlobals' no tiene el atributo 'start' – ensnare

2

Usted también es necesario actualizar el encabezado de longitud del contenido, de lo contrario los navegadores se molestan (y Chrome parece dar resultados impredecibles).

@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

que tenían "error tubería rota" servir archivos estáticos con la respuesta de Peter Farmer, y problemas con la redirección HTTP (301), por lo que sintoniza el código proporcionado, si ayuda.

@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 
Cuestiones relacionadas