Как проверить флаг отладки шаблона в шаблоне django?


знаете ли вы, Можно ли узнать в шаблоне django, установлен ли флаг TEMPLATE_DEBUG?

Я хотел бы отключить свой скрипт Google analytics, когда я запускаю свое приложение django на своей машине разработки. Что-то вроде тега шаблона {% if debug %} было бы идеально. К сожалению, я не нашел ничего подобного в документации.

конечно, я могу добавить этот флаг в контекст, но я хотел бы знать, если есть лучший способ сделать что.

6 55

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.9settings.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 не является логическим флагом, его функция, которая при вычислении while DEBUG = True возвращает некоторую отладочную информацию. Это может быть ненужными накладными расходами для вашего шаблона.

лично я делаю этот трюк вместо этого.

{% if request.META.HTTP_HOST == "127.0.0.1:8000" %}

это всегда будет работать, но вместо того, чтобы полагаться на флаг отладки и INTERNAL_IP, он просто работает для жестко закодированного IP.

вам нужно будет добавить DEBUG флаг в свой context_processors.

там может даже не быть альтернативным способом. По крайней мере, насколько мне известно.