python - pelicula - use django




Django: tiempo de visualización que tardó en cargar una página en cada página (4)

Actualicé middleware.py. En pocas palabras, agregamos algún texto único en la plantilla base, luego lo reemplazamos en Middleware process_response. Este método parece poco complicado, pero tenemos un tiempo de generación más cercano a cierto, y no tenemos ningún problema con javascript. Javascript en el cliente no puede usar encabezados de página en la primera página cargada, solo si crea un objeto XHR, luego obtiene la página.

https://stackoverflow.com/a/35237632/2837890

En Django, ¿cómo puedo devolver el tiempo que tomó cargar una página (no la fecha) en cada página del sitio, sin tener que escribir en cada views.py un código similar al siguiente?

start = time.time()
#model operations
loadingpagetime = time.time() - start

Si usar un TEMPLATE_CONTEXT_PROCESSOR es la mejor opción.
¿Cómo obtendría el tiempo de carga de la página completa desde allí, en lugar de solo obtener el tiempo de carga de la plantilla?

ACTUALIZAR:

Como la pregunta inicial no parece ser lo suficientemente clara, aquí hay un enfoque de lo que sería la versión de Python de lo que quiero hacer.

#!/usr/bin/env python
import cgitb; cgitb.enable() 
import time
print 'Content-type: text/html\n\n'

start = time.time()

print '<html>'
print '<head>'
print '</head>'
print '<body>'
print '<div>HEADER</div>'
print '<div>'
print '<p>Welcome to my Django Webpage!</p>'
print '<p>Welcome to my Django Webpage!</p>'
print '<p>Welcome to my Django Webpage!</p>'
print '</div>'

time.sleep(3)
loadingtime = time.time() - start

print '<div>It took ',loadingtime,' seconds to load the page</div>'
print '</body>'
print '</html>'

Puede crear un middleware personalizado para registrar esto. Aquí es cómo creo un middleware para lograr esta base de propósito en djangosnippets.org/snippets/358 (modifiqué el código un poco).

En primer lugar, suponiendo que su proyecto tiene un nombre: test_project , cree un nombre de archivo middlewares.py , lo test_project en la misma carpeta que settings.py :

from django.db import connection
from time import time
from operator import add
import re


class StatsMiddleware(object):

    def process_view(self, request, view_func, view_args, view_kwargs):
        '''
        In your base template, put this:
        <div id="stats">
        <!-- STATS: Total: %(total_time).2fs Python: %(python_time).2fs DB: %(db_time).2fs Queries: %(db_queries)d ENDSTATS -->
        </div>
        '''

        # Uncomment the following if you want to get stats on DEBUG=True only
        #if not settings.DEBUG:
        #    return None

        # get number of db queries before we do anything
        n = len(connection.queries)

        # time the view
        start = time()
        response = view_func(request, *view_args, **view_kwargs)
        total_time = time() - start

        # compute the db time for the queries just run
        db_queries = len(connection.queries) - n
        if db_queries:
            db_time = reduce(add, [float(q['time'])
                                   for q in connection.queries[n:]])
        else:
            db_time = 0.0

        # and backout python time
        python_time = total_time - db_time

        stats = {
            'total_time': total_time,
            'python_time': python_time,
            'db_time': db_time,
            'db_queries': db_queries,
        }

        # replace the comment if found
        if response and response.content:
            s = response.content
            regexp = re.compile(r'(?P<cmt><!--\s*STATS:(?P<fmt>.*?)ENDSTATS\s*-->)')
            match = regexp.search(s)
            if match:
                s = (s[:match.start('cmt')] +
                     match.group('fmt') % stats +
                     s[match.end('cmt'):])
                response.content = s

        return response

En segundo lugar, modifique settings.py para agregar su middleware:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    # ... your existing middlewares ...

    # your custom middleware here
    'test_project.middlewares.StatsMiddleware',
)

Nota: debe agregar la ruta completa a su clase de middleware como se indica arriba, el formato es:

<project_name>.<middleware_file_name>.<middleware_class_name>

Una segunda nota es que agregué este middleware al final de la lista porque solo quiero registrar el tiempo de carga de la plantilla solo. Si desea registrar el tiempo de carga de las plantillas + todos los middlewares, MIDDLEWARE_CLASSES al principio de la lista MIDDLEWARE_CLASSES (créditos en @Symmitchry).

Volviendo al tema principal, el siguiente paso es modificar tu base.html o las páginas en las que quieras registrar el tiempo de carga, agrega esto:

<div id="stats">
<!-- STATS: Total: %(total_time).2fs Python: %(python_time).2fs DB: %(db_time).2fs Queries: %(db_queries)d ENDSTATS -->
</div>

Nota: puede <div id="stats"> nombre a <div id="stats"> y usar CSS para ese div como quiera, pero NO cambie el comentario <!-- STATS: .... --> . Si desea cambiarlo, asegúrese de probarlo contra el patrón de expresiones regulares en el middlewares.py creado.

Voila, disfruta de las estadísticas.

EDITAR:

Para aquellos que usan mucho CBV (Class Based Views), es posible que haya encontrado el error ContentNotRenderedError con la solución anterior. No temas, esta es la solución en middlewares.py :

    # replace the comment if found
    if response:
        try:
            # detects TemplateResponse which are not yet rendered
            if response.is_rendered:
                rendered_content = response.content
            else:
                rendered_content = response.rendered_content
        except AttributeError:  # django < 1.5
            rendered_content = response.content
        if rendered_content:
            s = rendered_content
            regexp = re.compile(
                r'(?P<cmt><!--\s*STATS:(?P<fmt>.*?)ENDSTATS\s*-->)'
            )
            match = regexp.search(s)
            if match:
                s = (s[:match.start('cmt')] +
                     match.group('fmt') % stats +
                     s[match.end('cmt'):])
                response.content = s

    return response

Lo tengo trabajando con Django 1.6.x, si tienes un problema con otra versión de Django, por favor sígueme en la sección de comentarios.


Si desea mostrar información de carga de página a sus visitantes, la respuesta de Hieu Nguyen será una gran opción. Pero déjame recomendarte también algunas buenas herramientas.

Entonces, si necesita estos datos solo para fines de desarrollo, eche un vistazo a django-debug-toolbar . Se adjuntará una bonita barra de herramientas con estadísticas útiles para cada página, incluido el tiempo necesario para las consultas de DB, la representación de plantillas, etc.

Finalmente, si necesita herramientas de creación de perfiles profesionales para Djagno, New Relic podría ser una muy buena opción.


Geordi te da un desglose impresionante de todo lo que sucede en el ciclo de solicitud. Es un middleware que genera un árbol de llamadas completo para mostrarle exactamente lo que está sucediendo y cuánto tiempo se usa en cada función.

Se parece a esto:

Lo recomiendo mucho :)

Crédito de la imagen: http://evzijst.bitbucket.org/pycon.in







django