From f3ed126072e51bf54ff8976487bec3c44937bc61 Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 28 Jul 2026 21:10:04 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D1=82=D0=BD=D1=8B=D0=B9-=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=BE=D1=80=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D0=B5=D1=82=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20IS=5FDEBUG,=20?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B8=20ALLOW=5FTRACKING=20(=D0=BA=D1=83=D0=BA?= =?UTF-8?q?=D0=B8,=20=D1=87=D1=82=D0=BE=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=20=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=B8=D0=BB=D1=81?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B0=20=D0=BE=D1=82=D0=BB=D0=B5=D0=B6=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20Google=20Tag=20Manager,=20=D0=AF=D0=BD=D0=B4=D0=B5=D0=BA?= =?UTF-8?q?=D1=81.=D0=9C=D0=B5=D1=82=D1=80=D0=B8=D0=BA=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D1=82.=D0=BF.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lpon_site/frontend/context_processors.py | 51 +++++++++++++++++++----- lpon_site/lpon_site/settings.py | 2 +- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/lpon_site/frontend/context_processors.py b/lpon_site/frontend/context_processors.py index fad99be..bb26a24 100644 --- a/lpon_site/frontend/context_processors.py +++ b/lpon_site/frontend/context_processors.py @@ -1,27 +1,58 @@ from django.conf import settings from django.http import HttpRequest +# Имя куки, которая ставится клиенту, когда он СОГЛАСИЛСЯ на отслеживание +# (Google Tag Manager, Яндекс.Метрика и т.п.). Если кука присутствует — +# предупреждение о трекинге больше не показываем. +ALLOW_TRACKING_COOKIE_NAME = "allow_tracking" -def is_debug(request: HttpRequest) -> dict: + +def site_context(request: HttpRequest) -> dict: """ - Контекст-процессор Django. + Общий (универсальный) контекст-процессор Django для всего проекта. ЗАЧЕМ ЭТО НУЖНО: - Автоматически добавляет флаг режима отладки во ВСЕ шаблоны проекта, - без необходимости передавать его вручную в контексте каждой вьюхе. - Контекстный-процессор необходимо зарегистрировать в settings.py: - TEMPLATES['OPTIONS']['context_processors'] + Автоматически добавляет во ВСЕ шаблоны проекта переменные, которые + нужны почти на каждой странице, без необходимости передавать их + вручную в контексте каждой вьюхи. Контекст-процессор необходимо + зарегистрировать в settings.py: TEMPLATES['OPTIONS']['context_processors'] - ПОЧЕМУ НЕ штатный django.template.context_processors.debug: + ПОЧЕМУ ОДИН УНИВЕРСАЛЬНЫЙ ПРОЦЕССОР, А НЕ НЕСКОЛЬКО РАЗНЫХ: + И DEBUG-флаг, и флаг согласия на трекинг — это одинаковые по сути + "сквозные" данные: маленькие, не завязанные на конкретную вьюху, + нужные почти во всех шаблонах (в _base.html). Заводить под каждую + такую мелочь отдельный контекст-процессор — это лишний файл и лишняя + строка регистрации в settings.py на ровном месте. Если в будущем + появится много разнородных "сквозных" переменных — тогда, возможно, + стоит разнести их по смыслу (например, отдельно cookies-consent, + отдельно debug/env), но пока их всего две — держим вместе. + + ПОЧЕМУ НЕ штатный django.template.context_processors.debug (для IS_DEBUG): Штатный context-processor отдаёт переменную `debug` только если ОДНОВРЕМЕННО: settings.DEBUG == True И IP клиента входит в settings.INTERNAL_IPS (сверяется по request.META['REMOTE_ADDR']). В проекте с Docker/reverse-proxy — REMOTE_ADDR может быть не 127.0.0.1, а IP шлюза docker-сети, и потому штатный контекстный-процессор ненадёжен. + ПРО ALLOW_TRACKING: + Читаем куку request.COOKIES.get(ALLOW_TRACKING_COOKIE_NAME) — её + ставит клиентский JS (или сервер) ПОСЛЕ того, как пользователь + согласился с предупреждением об отслеживании (Google Tag Manager, + Яндекс.Метрика и т.п.). Если кука присутствует (независимо от её + значения — само наличие куки уже означает согласие) — предупреждение + в шаблоне больше не показываем, а также можно подключать сами + счётчики трекинга ({% if ALLOW_TRACKING %}...{% endif %}). + :return - dict: словарь с единственным ключом IS_DEBUG (bool) - будет доступен во всех шаблонах как переменная контекста: + dict: словарь с ключами: + IS_DEBUG (bool) — режим отладки Django (settings.DEBUG); + ALLOW_TRACKING (bool) — согласился ли клиент на отслеживание + (определяется по наличию куки "allow_tracking"). + Обе переменные доступны во всех шаблонах: {% if IS_DEBUG %}...{% endif %} + {% if ALLOW_TRACKING %}...{% endif %} """ - return {"IS_DEBUG": settings.DEBUG} + return { + "IS_DEBUG": settings.DEBUG, + "ALLOW_TRACKING": ALLOW_TRACKING_COOKIE_NAME in request.COOKIES, + } diff --git a/lpon_site/lpon_site/settings.py b/lpon_site/lpon_site/settings.py index 15ae359..a5af6f6 100644 --- a/lpon_site/lpon_site/settings.py +++ b/lpon_site/lpon_site/settings.py @@ -105,7 +105,7 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', - 'frontend.context_processors.is_debug', + 'frontend.context_processors.site_context', ], }, },