Django:显示每个页面加载页面所需的时间

在Django中,我怎样才能在网站的每个页面上返回加载页面 (而不是date)的时间, 不必在每个views.py中写入类似于下面的代码?

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

如果使用TEMPLATE_CONTEXT_PROCESSOR是最好的select。
我怎么会从那里得到整个页面加载时间,而不是只是获得模板加载时间?

更新:

由于最初的问题似乎还不够清楚,下面是我想要做什么的Python版本的一个方法。

 #!/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>' 

您可以创build一个自定义中间件来logging这个。 这里是我如何创build一个中间件来实现这个目的基于http://djangosnippets.org/snippets/358/ (我修改了一下代码)。

首先,假设你的项目有一个名字: test_project ,创build一个文件名middlewares.py ,我把它放在与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 

其次,修改settings.py来添加你的中间件:

 MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # ... your existing middlewares ... # your custom middleware here 'test_project.middlewares.StatsMiddleware', ) 

注意:您必须像上面那样添加完整path到您的中间件类,格式是:

 <project_name>.<middleware_file_name>.<middleware_class_name> 

第二个注意事项是我将这个中间件添加到列表的末尾,因为我只想logging模板加载时间。 如果你想logging模板+所有中间件的加载时间,请把它放在MIDDLEWARE_CLASSES列表的开始处(积分到@Symmitchry)。

回到主题,下一步是修改你的base.html或者任何想要加载时间的页面,添加这个:

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

注意:你可以命名<div id="stats">并使用该div的CSS,但是不要改变注释<!-- STATS: .... --> 。 如果要更改它,请确保在创build的middlewares.py .py中针对正则expression式进行testing。

瞧,享受统计。

编辑:

对于那些使用CBV(基于类的视图)的人来说,您可能遇到了上述解决scheme中的错误ContentNotRenderedError 。 不用担心,这里是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 

我得到它与Django 1.6.x的工作,如果你有其他版本的Django的问题,请在评论部分ping我。

Geordi为您提供了一个在请求周期中发生的所有事情的绝妙分解。 这是一个中间件,可以生成一个完整的调用树,以显示正在发生的事情以及在每个函数中花费的时间。

它看起来像这样:

在这里输入图像说明

我强烈推荐:)

图片来源: http : //evzijst.bitbucket.org/pycon.in

我可能是错的,但我记得的第一件事是document.ready和ajax …我不认为这是最好的解决scheme,但它应该是相当简单的不仅在django而且其他地方实现。 当你在一个视图中处理请求时,你启动定时器,当document.ready被触发时,你做一个ajax调用来停止定时器。 但是我应该承认@Hieu Nguyen相当出色)

如果你想显示页面加载信息给你的访客,Hieu Nguyen的答案将是一个不错的select。 但是让我也推荐一些好工具。

所以如果你只是为了开发的目的而需要这些数据的话,请看django-debug-toolbar 。 它会附上一个漂亮的工具栏,为每个页面提供有用的统计信息,包括数据库查询,模板渲染等所需的时间。

最后,如果您需要专业的Djagno分析工具, New Relic可能是一个非常好的select。

我升级了middleware.py。 简而言之,我们在基本模板中添加一些独特的文本,然后将其replace为中间件process_response。 这种方法看起来有点棘手,但我们有更接近真实的世代时间,我们没有问题的JavaScript。 客户端上的Javascript不能在第一个加载的页面上使用页眉,只有创buildXHR对象,然后才能获取页面。

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