我想查看我网站中视图的执行时间。这可以由装饰者完成,但由于我有几十个视图,我想在中间件中进行操作,将请求作为关键字保存在字典中的初始时间(见下文),但我担心我做的假设(见下文):
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]
此代码假设有两点:
这些假设是否安全? 这个中间件是个好主意吗?
答案 0 :(得分:6)
阅读Is Django middleware thread safe?给了我一个更好的主意:
在执行视图之前向请求对象添加属性(即request.start_time = time.time()
)。
这避免了假设1并消除了在字典中收集永远无法清除的“僵尸”项目的危险可能性。
这也有些减少了假设2,因为如果在某个时刻发出了新的请求副本,那么在复制属性时它仍然可以工作(如在python复制模块中所做的那样)。
即使作为奖励,它的代码更少,更容易出错,更易读:)
答案 1 :(得分:1)
使用这个简单的视图来计算执行时间,它也适用于那些视图 需要用户登录,它在一个简单的页面中显示执行时间
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})
对于你的情况,为你的所有页面使用循环 希望它会帮助某人