在Django中,如何在网站的每个页面中返回加载页面(不是日期)的时间,不用必须在每个views.py 中编写类似于以下代码的代码?
start = time.time()
#model operations
loadingpagetime = time.time() - start
如果使用TEMPLATE_CONTEXT_PROCESSOR
是最佳选择
如何从那里获得整个页面加载时间,而不仅仅是获取模板加载时间?
更新
由于最初的问题似乎不够明确,所以我想要做的是 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>'
答案 0 :(得分:64)
您可以创建自定义middleware来记录此内容。以下是基于http://djangosnippets.org/snippets/358/创建中间件以实现此目的的方法(我稍微修改了一下代码)。
首先,假设您的项目名称为test_project
,请创建文件名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',
)
注意:您必须像上面一样添加中间件类的完整路径,格式为:
<project_name>.<middleware_file_name>.<middleware_class_name>
第二个注意事项是我将此中间件添加到列表的末尾,因为我只想单独记录模板加载时间。如果您想记录模板+所有中间件的加载时间,请将其放在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: .... -->
。如果要更改它,请确保根据创建的middlewares.py
中的正则表达式模式对其进行测试。
Voila,享受统计数据。
修改强>
对于那些经常使用CBV(基于类的视图)的人,您可能会遇到上述解决方案的错误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我。
答案 1 :(得分:20)
答案 2 :(得分:1)
我可能错了,但我记得的第一件事就是document.ready和ajax ...... 我不认为这是最好的解决方案,但它不仅应该在django中实现,而且应该在其他任何地方实现。 当您在视图中处理请求时,您启动计时器,并且当document.ready被触发时,您进行ajax调用以停止计时器。 但我应该承认@Hieu Nguyen非常出色)
答案 3 :(得分:0)
如果您想向访问者显示页面加载信息,Hieu Nguyen的答案将是一个很好的选择。但是,我也建议你使用一些好的工具。
因此,如果您仅为开发目的而需要此数据,请查看django-debug-toolbar。它将附加一个漂亮的工具栏,其中包含每个页面的有用统计信息,包括数据库查询所花费的时间,模板渲染等。
最后,如果您需要专业的Djagno分析工具,New Relic可能是一个非常好的选择。
答案 4 :(得分:0)
我升级了中间件.py。简而言之,我们在基本模板中添加了一些独特的文本,然后在Middleware process_response中替换它。这个方法看起来有点棘手,但我们的生成时间更接近真实,我们对javascript没有问题。客户端上的Javascript无法在第一个加载页面上使用页眉,只有在创建XHR对象时才能使用页面。