在Django中,我如何返回网站every页中的时间it took to load a page(而不是日期),withoutwrite in every views.py的代码与下面的代码类似?

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

如果使用TEMPLATE_CONTEXT_PROCESSOR是最好的 Select

UPDATE:

由于最初的问题似乎不够清楚,这里有一种方法来说明我想要做的事情的Python version个是什么.

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

推荐答案

您可以创建自定义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中的正则表达式模式对其进行测试.

瞧,好好享受统计数据吧.

EDIT:

对于那些经常使用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的其他版本有问题,请在 comments 区给我打电话.

Django相关问答推荐

如何在Django中更改模型字段名称?

如何在django模板中渲染标签集

如何在Django上创建ManyToMany管理面板?

Django Form初始值不在呈现上起作用

APIView查询未返回任何结果

如何在Django模板中有条件地传递值给with变量?

Django如何在没有ctrl点击的情况下允许多选

Django rest框架:自定义对象权限不起作用

PyCharm:强制 Django 模板语法突出显示

如何将表单中的用户字段设置为当前登录的用户?

所有子元素的Django自递归外键过滤器查询

Django 密码以什么格式存储在数据库中?

为什么 django 1.7 会为字段 Select 的变化创建迁移?

django excel xlwt

Django admin:我可以定义字段顺序吗?

Django 模板列表的第一个元素

django 在 unittest 测试中设置环境变量

如何向所有 Django 响应添加 HTTP 标头

将属性添加到 Django 模型的 Meta 类中

在 Django REST 框架序列化程序中动态排除或包含字段