From d75606c95278e1b19ff853ecf944375a395c7f38 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 14 Aug 2026 14:28:06 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=9A=D0=BE=D0=BD=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D1=82=D0=BD=D1=8B=D0=B9=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=BE=D1=80,=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B8=20=D1=81=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F=20IS=5FDEBUG=20=D0=B8=20ALLOW=5F?= =?UTF-8?q?TRACKING=20=D0=B2=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hypn0/hypn0/settings.py | 1 + hypn0/hypn0_site/context_processors.py | 58 ++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 hypn0/hypn0_site/context_processors.py diff --git a/hypn0/hypn0/settings.py b/hypn0/hypn0/settings.py index c5bf902..89035b3 100644 --- a/hypn0/hypn0/settings.py +++ b/hypn0/hypn0/settings.py @@ -95,6 +95,7 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + 'hypn0_site.context_processors.site_context', ], }, }, diff --git a/hypn0/hypn0_site/context_processors.py b/hypn0/hypn0_site/context_processors.py new file mode 100644 index 0000000..bb26a24 --- /dev/null +++ b/hypn0/hypn0_site/context_processors.py @@ -0,0 +1,58 @@ +from django.conf import settings +from django.http import HttpRequest + +# Имя куки, которая ставится клиенту, когда он СОГЛАСИЛСЯ на отслеживание +# (Google Tag Manager, Яндекс.Метрика и т.п.). Если кука присутствует — +# предупреждение о трекинге больше не показываем. +ALLOW_TRACKING_COOKIE_NAME = "allow_tracking" + + +def site_context(request: HttpRequest) -> dict: + """ + Общий (универсальный) контекст-процессор Django для всего проекта. + + ЗАЧЕМ ЭТО НУЖНО: + Автоматически добавляет во ВСЕ шаблоны проекта переменные, которые + нужны почти на каждой странице, без необходимости передавать их + вручную в контексте каждой вьюхи. Контекст-процессор необходимо + зарегистрировать в settings.py: TEMPLATES['OPTIONS']['context_processors'] + + ПОЧЕМУ ОДИН УНИВЕРСАЛЬНЫЙ ПРОЦЕССОР, А НЕ НЕСКОЛЬКО РАЗНЫХ: + И 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) — режим отладки Django (settings.DEBUG); + ALLOW_TRACKING (bool) — согласился ли клиент на отслеживание + (определяется по наличию куки "allow_tracking"). + Обе переменные доступны во всех шаблонах: + {% if IS_DEBUG %}...{% endif %} + {% if ALLOW_TRACKING %}...{% endif %} + """ + return { + "IS_DEBUG": settings.DEBUG, + "ALLOW_TRACKING": ALLOW_TRACKING_COOKIE_NAME in request.COOKIES, + }