如何检查django模板中的TEMPLATE_DEBUG标志?

你知道是否有可能在django模板中知道是否设置了TEMPLATE_DEBUG标志?

我想在我的开发机器上运行我的django应用程序时禁用我的谷歌分析脚本。 类似于{%if debug%}模板标签就是完美的。 不幸的是,我没有在文档中find类似的东西。

当然,我可以添加这个标志的上下文,但我想知道是否有更好的方法来做到这一点。

假设您没有在settings.py中将TEMPLATE_CONTEXT_PROCESSORS设置为其他值,Django将自动加载debug上下文预处理器(如此处所述)。 这意味着如果 settings.DEBUG为true 并且您的本地计算机的IP地址(可以简单地为127.0.0.1)在variablessettings.INTERNAL_IPS ( 这里描述)中settings.INTERNAL_IPS ,您将有权访问模板中名为debug的variables。 。 settings.INTERNAL_IPS是Django应该识别为“内部”的元组或IP地址列表。

如果修改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说:;

作为string的IP地址列表:

  • 允许debug()上下文处理器向模板上下文添加一些variables。

debug上下文处理器在默认的settings.py

如果你还没有,那么看看djangosnippets上的其他人是否处理过同样的问题总是有帮助的。 使用分析标记的最新代码段是1656年: http : //www.djangosnippets.org/snippets/1656/

这个解决scheme的好处是它允许你保持你的GOOGLE_ANALYTICS_CODE = xxxxxx在local_settings.py的情况下其余的源代码是公开的,你的密钥保持私有。 另外,它还额外采取了一些步骤,不要使用已login用户的分析function。

包括Google Analytics的Javascript。 在DEBUG开启时或工作人员用户不会显示Google Analytics代码。

在您的模板中使用{% googleanalyticsjs %}

你必须设置类似的东西

 GOOGLE_ANALYTICS_CODE = "UA-1234567-1" 

在你的设置文件中。

假设模板variables中的'user'是request.user ,如果使用:

 return render_to_response('template.html',{ }, context_instance=RequestContext(request)) 

(假设django.core.context_processors.authTEMPLATE_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不是一个布尔标志,它的一个函数,当DEBUG = True时评估返回一些debugging信息。 这可能是您的模板不必要的开销。

就我个人而言,我是这样做的。

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

这将始终工作,而不是依靠DEBUG标志和INTERNAL_IP,它只是为硬编码的IP工作。

您将需要将DEBUG标志添加到您的context_processors

甚至可能没有其他办法。 至less,没有我所知道的。