如何在Django中计算响应时间

9

如何计算从用户输入搜索条件到相关信息加载/显示在门户上的响应时间?


开始时间(日期时间,放在代码的第一行)-结束时间(日期时间,放在代码的最后一行) - Shiva
2
如果您想在Django应用程序的不同方面进行更强大的调试,请查看django debug toolbar - Sohaib Farooqi
4个回答

17

自Django 1.10版本开始,现在工作方式有所不同。

https://docs.djangoproject.com/en/3.0/topics/http/middleware/

新样式如下:

import time


class StatsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        start_time = time.time()

        response = self.get_response(request)

        duration = time.time() - start_time

        # Add the header. Or do other things, my use case is to send a monitoring metric
        response["X-Page-Generation-Duration-ms"] = int(duration * 1000)
        return response

不需要在请求对象上存储开始时间并检索,因为所有操作都发生在同一个方法中。

也可以使用简单的函数形式来完成,而不是类:

import time


def stats_middleware(get_response):

    def middleware(request):
        start_time = time.time()

        response = get_response(request)

        duration = time.time() - start_time

        response["X-Page-Generation-Duration-ms"] = int(duration * 1000)
        return response

    return middleware

13

Django是用于后端操作的Python框架。它的目的是处理HTTP请求,因此您的问题“从用户输入搜索条件到相关信息加载/显示的时刻”在这个上下文中非常模糊。您的问题表明您正在查看基于交互式JavaScript / Ajax 的前端?

如果您对单个HTTP请求的渲染时间感到好奇,可以使用自定义中间件来解决,类似于以下内容:

class StatsMiddleware(object):
    def process_request(self, request):
        "Start time at request coming in"
        request.start_time = time.time()

    def process_response(self, request, response):
        "End of request, take time"
        total = time.time() - request.start_time

        # Add the header.
        response["X-total-time"] = int(total * 1000)
        return response

然后,在相应的 Django settings.py 部分中添加此中间件:

MIDDLEWARE_CLASSES = (
  ...
  'app.stats.StatsMiddleware',
  ...
)

生成响应所花费的时间将会被添加到一个名为“X-total-time”的自定义HTTP头中。请注意,这将包括所有渲染、计算、第三方系统和数据库操作。


我在我的应用程序文件夹中创建了一个名为stats.py的文件,并且已经成功地执行了它。请问如何将这个持续时间显示在网页上或者其他可以收集这种持续时间的地方?请给予建议。谢谢。 - KenL
1
当将其添加到settings.py中的MIDDLEWARE_CLASSES时,结果应在响应的“X-total-time”标头中显示每个请求。如果您希望在页面上显示结果,则应利用模板系统。但是,这种方法可能会在测量中省略渲染时间。要查看响应标头,Web控制台(例如Firefox)就足够了。 - Andreas Neumeier
3
重要提示:为了记录最长时间,它应作为MIDDLEWARE_CLASSES中的第一个中间件进行安装。 - pymen
请使用MiddlewareMixin而不是object。 - Amr

2
这是负责整个过程的类。
import time


class StatsMiddleware(object):

    def process_request(self, request):
        "Store the start time when the request comes in."
        request.start_time = time.time()

    def process_response(self, request, response):
        "Calculate and output the page generation duration"
        # Get the start time from the request and calculate how long
        # the response took.
        duration = time.time() - request.start_time

        # Add the header.
        response["X-Page-Generation-Duration-ms"] = int(duration * 1000)
        return response

其实就是这样,只需在请求到来时存储时间,稍后再检索即可。

要安装上述中间件,只需将其添加到您的settings.py文件中:

MIDDLEWARE_CLASSES = (
    'project.stats_middleware.StatsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
)

你的答案和@Andreas的有什么不同? - Sohaib Farooqi
2
其实我正在写代码,当我要发布时,发现他已经发布了解决方案。 - Usman Maqbool
谢谢。请问我应该在哪里添加这个类?是在view.py文件中吗? - KenL
将其放在名为stats_middleware.py的文件中。 - Usman Maqbool
我在我的应用程序文件夹中创建了一个名为stats_middleware.py的文件,并且已经成功地执行了它。请问如何将此持续时间显示在网页或其他可收集此类持续时间的地方?请建议。谢谢。 - KenL

-3

你可以在互联网浏览器中查看它(F12),或者如果你使用POSTMAN,它会显示时间。 此外,你还可以使用标准的Python库time来测量代码执行时间。


2
你应该提供一个最小化的示例来说明你所建议的方法。这样并没有什么帮助。 - Sohaib Farooqi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接