44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
import time
|
|
from django.db import connection
|
|
|
|
|
|
class TimingMiddleware:
|
|
"""Middleware that measures request total time and DB query time.
|
|
|
|
Note: `connection.queries` is populated only when Django debug is enabled
|
|
(DEBUG=True) or when using a debug cursor. When not available, DB time
|
|
will be left as None.
|
|
"""
|
|
|
|
def __init__(self, get_response):
|
|
self.get_response = get_response
|
|
|
|
def __call__(self, request):
|
|
start = time.time()
|
|
|
|
# record initial number of collected queries (if available)
|
|
try:
|
|
initial_q_count = len(connection.queries)
|
|
except Exception:
|
|
initial_q_count = 0
|
|
|
|
response = self.get_response(request)
|
|
|
|
total = time.time() - start
|
|
|
|
db_time = None
|
|
try:
|
|
qs = getattr(connection, 'queries', None)
|
|
if qs:
|
|
# sum only queries executed during this request
|
|
new_queries = qs[initial_q_count:]
|
|
db_time = sum(float(q.get('time', 0)) for q in new_queries)
|
|
except Exception:
|
|
db_time = None
|
|
|
|
# attach to request so context processor can read them
|
|
request.db_time = db_time
|
|
request.total_time = total
|
|
|
|
return response
|