Как проверить флаг отладки шаблона в шаблоне django?
знаете ли вы, Можно ли узнать в шаблоне django, установлен ли флаг TEMPLATE_DEBUG?
Я хотел бы отключить свой скрипт Google analytics, когда я запускаю свое приложение django на своей машине разработки. Что-то вроде тега шаблона {% if debug %} было бы идеально. К сожалению, я не нашел ничего подобного в документации.
конечно, я могу добавить этот флаг в контекст, но я хотел бы знать, если есть лучший способ сделать что.
6 ответов:
предполагая, что вы не установили
TEMPLATE_CONTEXT_PROCESSORS
к некоторому другому значению вsettings.py
, Django автоматически загрузитdebug
препроцессор контекста (как отмечено здесь). Это означает, что вы будете иметь доступ к переменной с именемdebug
в ваши шаблоны еслиsettings.DEBUG
истинно и IP-адрес вашей локальной машины (который может быть просто 127.0.0.1) установлен в переменнойsettings.INTERNAL_IPS
(который описан здесь).settings.INTERNAL_IPS
- это кортеж или список IP адреса, которые Django должен признать "внутренними".
при изменении
INTERNAL_IPS
невозможно / подходит, вы можете сделать это с помощью контекстного процессора:на
myapp/context_processors.py
:from django.conf import settings def debug(context): return {'DEBUG': settings.DEBUG}
на
settings.py
:TEMPLATE_CONTEXT_PROCESSORS = ( ... 'myapp.context_processors.debug', )
тогда в моих шаблонах, просто:
{% if DEBUG %} .header { background:#f00; } {% endif %}
Django 1.9
settings.py
:INTERNAL_IPS = ( '127.0.0.1', )
Шаблоны:
{% if debug %}
https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-INTERNAL_IPS говорит:
список IP-адресов, как строки, что:
- разрешить процессору контекста debug () добавлять некоторые переменные в контекст шаблона.
The
debug
контекстный процессор по умолчаниюsettings.py
.
если вы еще не сделали, это всегда помогает увидеть, если/как другие имели дело с той же проблемой на djangosnippets. Самый последний сниппет, работающий с тегом analytics - 1656: http://www.djangosnippets.org/snippets/1656/
что приятно в этом решении, так это то, что оно позволяет вам сохранить свой
GOOGLE_ANALYTICS_CODE = xxxxxx
in local_settings.py в случае, если остальная часть вашего источника является общедоступной, ваш ключ остается закрытым. Кроме того, это дополнительный шаг, чтобы не использовать аналитику для входа в систему пользователи.включает в себя Javascript для Google Analytics. Не будет показывать код Google Analytics, когда отладка включена или для штатных пользователей.
использовать
{% googleanalyticsjs %}
в ваши шаблоны.вы должны установить что-то вроде
GOOGLE_ANALYTICS_CODE = "UA-1234567-1"
в файле настроек.
предполагает, что "пользователь" в переменных шаблона является
request.user
, что будет, если вы используете:return render_to_response('template.html',{ }, context_instance=RequestContext(request))
(если
django.core.context_processors.auth
находится вTEMPLATE_CONTEXT_PROCESSORS
, который он по умолчанию)
from django import template import settings register = template.Library() class ShowGoogleAnalyticsJS(template.Node): def render(self, context): code = getattr(settings, "GOOGLE_ANALYTICS_CODE", False) if not code: return "<!-- Goggle Analytics not included because you haven't set the settings.GOOGLE_ANALYTICS_CODE variable! -->" if 'user' in context and context['user'] and context['user'].is_staff: return "<!-- Goggle Analytics not included because you are a staff user! -->" if settings.DEBUG: return "<!-- Goggle Analytics not included because you are in Debug mode! -->" return """ <script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> try { var pageTracker = _gat._getTracker('""" + str(code) + """'); pageTracker._trackPageview(); } catch(err) {}</script> """ def googleanalyticsjs(parser, token): return ShowGoogleAnalyticsJS() show_common_data = register.tag(googleanalyticsjs)
{% if debug %}
может сделать трюк, но только если вы передаетеRequestContext
вместоContext
. Кроме того,debug
не является логическим флагом, его функция, которая при вычислении whileDEBUG = True
возвращает некоторую отладочную информацию. Это может быть ненужными накладными расходами для вашего шаблона.лично я делаю этот трюк вместо этого.
{% if request.META.HTTP_HOST == "127.0.0.1:8000" %}
это всегда будет работать, но вместо того, чтобы полагаться на флаг отладки и INTERNAL_IP, он просто работает для жестко закодированного IP.