From c73982850c1f7350de5cca9a922865ba9e732d9a Mon Sep 17 00:00:00 2001 From: ack_ik Date: Mon, 26 Jan 2026 15:27:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B2=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/context_processors.py | 11 ++++++++ core/middleware.py | 43 ++++++++++++++++++++++++++++++++ core/settings.py | 2 ++ templates/components/footer.html | 2 +- 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 core/context_processors.py create mode 100644 core/middleware.py diff --git a/core/context_processors.py b/core/context_processors.py new file mode 100644 index 0000000..47069b0 --- /dev/null +++ b/core/context_processors.py @@ -0,0 +1,11 @@ +import os + + +def env_and_timing(request): + """Provide ENV_TYPE and request timing info to templates.""" + env = os.getenv('ENV_TYPE', 'local') + return { + 'env_type': env, + 'db_time': getattr(request, 'db_time', None), + 'total_time': getattr(request, 'total_time', None), + } diff --git a/core/middleware.py b/core/middleware.py new file mode 100644 index 0000000..2cb5813 --- /dev/null +++ b/core/middleware.py @@ -0,0 +1,43 @@ +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 diff --git a/core/settings.py b/core/settings.py index 0802319..b1a78e0 100644 --- a/core/settings.py +++ b/core/settings.py @@ -43,6 +43,7 @@ INSTALLED_APPS = [ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'core.middleware.TimingMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -64,6 +65,7 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + 'core.context_processors.env_and_timing', ], }, }, diff --git a/templates/components/footer.html b/templates/components/footer.html index 7d5a18c..fb86f21 100644 --- a/templates/components/footer.html +++ b/templates/components/footer.html @@ -1,7 +1,7 @@