django通过middleware计算每个页面的详细执行时间

使用自定义中间件实现性能统计
本文介绍如何在Django框架中自定义一个中间件类,用于在公共模板中实时显示请求处理的总时间、Python执行时间和数据库查询时间。通过在settings.py中配置中间件并应用CSS样式,实现对应用性能的直观展示。

你可以自定义一个MiddleWare类,然后在settings.py引用这个中间件,添加到MIDDLEWARE_CLASSES里,然后在公共模板里添显示代码即可。

 

添加到公共模板里的代码:

<div id="stats"><!-- STATS: Total: %(totTime).2fs <br/>Python: %(pyTime).2fs<br/>DB: %(dbTime).2fs <br/>Queries: %(queries)d --></div>

 

StatsMiddleware 中间件代码

 

 

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:

        {% if debug %}  <div id="stats"><!-- STATS: Total: %(totTime).2fs <br/>

        Python: %(pyTime).2fs <br/>

        DB: %(dbTime).2fs <br/>

        Queries: %(queries)d --></div> {% endif %}

 

        Here's the css style I use:

        #stats { font-size: 65%; padding: 5px;

        z-index: 1000; position: absolute; right: 5px; top: 5px;

        -moz-opacity: .7; opacity: .7;}

        """

 

        #This stuff will only happen if debug is already on

        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)

        totTime = time() - start

 

        # compute the db time for the queries just run

        queries = len(connection.queries) - n

        if queries:

            dbTime = reduce(add, [float(q['time'])

                                  for q in connection.queries[n:]])

        else:

            dbTime = 0.0

 

        # and backout python time

        pyTime = totTime - dbTime

 

        stats = {

            'totTime': totTime,

            'pyTime': pyTime,

            'dbTime': dbTime,

            'queries': queries,

            }

 

        # replace the comment if found

        if response and response.content:

            s = response.content

            regexp = re.compile(r'(?P<cmt><!--\s*STATS:(?P<fmt>.*?)-->)')

            match = regexp.search(s)

            if match:

                s = s[:match.start('cmt')] + \

                    match.group('fmt') % stats + \

                    s[match.end('cmt'):]

                response.content = s

 

        return response

 

保存为:statsmiddleware.py, 
然后添加到settings.py的MIDDLEWARE_CLASSES里 

 

文章转载:http://www.sharejs.com/codes/python/8638

转载于:https://www.cnblogs.com/weiok/p/4872127.html

### Django 中间件使用说明 中间件是在处理请求和响应之间执行的一系列函数。这些函数可以在视图之前或之后运行,用于修改输入的请求对象或输出的响应对象。Django 的 `MIDDLEWARE` 设置允许开发者指定哪些中间件类应该被激活。 #### 配置 MIDDLEWARE 列表 为了启用中间件功能,在项目的设置文件(通常是 `settings.py`)中定义 `MIDDLEWARE` 列表[^4]: ```python MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ``` 上述列表展示了常见的中间件组件及其作用顺序。每当中间件接收到一个 HTTP 请求时,它会按照此列表中的顺序依次调用;而当返回给客户端前,则按相反顺序处理响应。 #### 自定义中间件 创建自定义中间件非常简单,只需编写 Python 类并实现两个特殊的方法:`__init__()` 和 `process_request()`, 或者其他可选方法如 `process_view()`, `process_template_response()`, `process_exception()`, 以及 `process_response()`。下面是一个简单的例子展示如何构建自己的日志记录中间件: ```python class SimpleLoggingMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 执行任何必要的预处理逻辑 response = self.get_response(request) # 记录每次访问的信息到控制台或其他地方 print(f"Request path: {request.path}") return response ``` 要使新的中间件生效,记得将其添加至 `MIDDLEWARE` 数组内。 #### 常见内置中间件介绍 - **Session Middleware**: 处理会话数据,使得应用程序能够跨多个页面保持用户状态信息[^1]。 - **CSRF Protection Middleware (`CsrfViewMiddleware`) :** 提供针对跨站请求伪造攻击(CSRF)的安全防护措施,确保只有来自合法源的数据才能提交成功[^5]。 - **Authentication Middleware:** 支持基于用户的认证机制,自动填充 `request.user` 属性以便于后续业务逻辑判断当前登录身份。 - **Message Framework Middleware (MessageMiddleware):** 实现消息框架的功能,方便向用户提供临时通知提示信息。 通过合理配置和利用不同类型的中间件,可以极大地简化 Web 应用开发过程,并增强系统的安全性和功能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值