当前位置: 首页 > 面试题库 >

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

慕烨烁
2023-03-14
问题内容

在Django中,如何返回在网站的 每个* 页面中 加载页面 (而不是日期)所 花费 的时间, 不必
在每个views.py中 编写类似于以下代码的代码?
*

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

如果使用aTEMPLATE_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>'

问题答案:

您可以创建一个自定义的中间件来进行记录。这是我基于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,但不要更改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>.*?)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我。



 类似资料:
  • 我的jsp中有一个这样的tr。 我也有这样的选择。 select中使用的javascript函数如下所示。 因此,如果所选行不是0,我将不会在页面中显示tr。这很好用 我在请求中设置了dateRange变量。setAttribute()并从操作发送它 问题是从请求值中正确地选择了选项,但是没有显示tr 我尝试在jsp中的表单外部这样运行它,希望它能在页面加载之前执行,但没有发生。 有什么想法吗?

  • 问题内容: 我的网站上有一个版块,在进行一些密集的通话时加载速度很慢。 知道如何div在页面准备时显示类似于“加载”的内容,然后在一切准备就绪时消失吗? 问题答案: 我需要这个,经过一番研究,我想到了这个(需要jQuery): 首先,在标签之后添加以下代码: 然后将div和图片的样式类添加到CSS: 然后,将此JavaScript添加到您的页面中(当然,最好在页面结尾处,在结束

  • 问题内容: 在某个AngularJS视频中,我看到了如何避免在Javascript解析表达式之前将其可见。但是我不记得它是怎么做到的… 我有一个,我想说“正在加载…” AngularJS有机会来分析它。如何才能做到这一点? 问题答案: 就像其他人提到的那样,使用ng-cloak,但是如果它是第一个加载到您的页面中的内容,还可以将以下内容添加到您的CSS中。 这将确保您的div模板是隐藏的。在该di

  • 好的,首先,我将告诉这应该如何工作:我有一个页面的图片链接下侧,点击一个图片,该链接的信息出现在另一个div。我使用jQuery/Ajax将链接id发布到一个php文件中,并将该数据返回到所选的div。链接应该分页,以便一次显示4个。 这是正在发生的事情:post部分是ok的,当我单击一个链接时,正确的数据将显示在所选的div中。我不知道如何使链接div分页虽然。我需要他们分页时,页面加载,现在当

  • 问题内容: 我尝试在我的网站中实施AJAX。单击div changepass的内容时,则应加载changepass.template.php。这是我为此使用的代码。 我的问题是在页面changepass.template.php完全加载时如何显示GIF动画(loading.gif)。请给我一些代码提示。 问题答案: 有很多方法可以做到这一点。一种简单的方法: JS: 詹姆斯·怀斯曼 ( James

  • 问题内容: 当有人首次访问页面时(登录我的应用程序后),我试图显示一种引导模式。我想使用模式来提供“入门”视频,并提供“不要再向我展示”复选框,以便访问者可以在以后的登录时绕过“入门模式”。 我可以使用以下教程在页面加载时显示模式: 在页面加载时启动Bootstrap Modal 但是,现在我只停留在如何使它仅在用户登录后第一次访问该页面时显示它(它当前在刷新页面时启动等)。 我是Java语言和编

  • 问题内容: 在我的index.html页面中,我想在加载应用程序时加载一个单独的Ajax页面,最好的方法是什么?这是我的索引代码: 在这里加载ajax子页面..... 子页面就是: 内容.............. 谢谢。 问题答案: 使用JavaScript可以做到这一点。您必须在页面加载时执行此操作。这是jQuery中的示例。

  • 我试图显示与Html文件位于同一文件夹中的静态图像,但似乎无法获得正确显示的正确路径。我正在开发的应用程序还包括一个从数据库获取数据的java后端,我使用HTML和javascript在前端显示它,整个应用程序作为插件在Web服务器上运行。图像和Html文件都位于此处: Web应用程序的URL路径是: <代码>https://staging.com/jira/secure/SchedulerAct