在Django中测量视图执行时间是个好主意



我想检查我的站点中视图的执行时间。这可以由decorator完成,但由于我有几十个视图,我想在中间件中完成,以请求为关键字在字典中节省初始时间(见下文),但我担心我所做的假设(见下文

class SlowWarningMiddleware:
    def __init__(self):
        self.time_tracking = {}
    def process_view(self, request, view_func, view_args, view_kwargs):
        self.time_tracking[request] = time.time() 
    def process_response(self, request, response):
        if request not in self.time_tracking:
            return response
        delta = time.time() - self.time_tracking[request]
    def process_exception(self, request, exception):
        if request not in self.time_tracking:
            return
        delta = time.time() - self.time_tracking[request]

该代码假定两点:

  1. 相同的中间件实例处理视图前和视图后逻辑
  2. 请求实例保持相同的实例前视图和后视图

这些假设安全吗?这个中间件是个好主意吗?

Reading Django中间件线程安全吗?给了我一个更好的主意:
向请求对象添加属性(即视图执行前的request.start_time = time.time())。

这避免了假设1,并消除了在字典中收集永远不会清除的"僵尸"项目的危险可能性。

这也在一定程度上减少了假设2,因为如果在某个时候创建了请求的新副本,那么如果复制了属性(如python复制模块中所做的),它仍然可以工作。

即使是额外的好处,它的代码更少,更容易出错,可读性更强:)

使用这个简单的视图来计算执行时间,它也适用于需要用户登录,它在一个简单的页面中显示执行时间

 def test(request):
     from django.test.client import Client
     import time
     c = Client()
     #client login if needed
     response = c.post('/login/', {'username': 'admin', 'password': 'password'})
     start = time.time()
     response = c.get('/pagetotest/')
     #print response
     #print 'Finished, time: ', time.time() - start # output to console
     end=time.time() - start
     return render(request,'loadingtime.html',{'time':end})

对于您的情况,对所有页面使用循环希望它能帮助

相关内容

最新更新