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

Django:在每个页面上显示加载页面所需的时间,第1张

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

您可以创建一个自定义的中间件来进行记录。这是我基于http://djangosnippets.org/snippets/358/创建中间件以实现此目的的方式(我对代码进行了一些修改)。

首先,假设您的项目有一个名称:

test_project
,创建一个文件名
middlewares.py
,然后将其放置在与以下文件夹相同的文件夹中
settings.py

from django.db import connectionfrom time import timefrom operator import addimport reclass 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>.*?)ENDSTATSs*-->)') 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,但不要更改comment
<!-- STATS: ....-->
。如果要更改它,请确保已针对created中的正则表达式模式进行了测试
middlewares.py

瞧,享受统计数据。

编辑:

对于经常使用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>.*?)ENDSTATSs*-->)' ) 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我。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5655582.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存