如何检查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.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
不是一个布尔标志,它的一个函数,当DEBUG = True
时评估返回一些debugging信息。 这可能是您的模板不必要的开销。
就我个人而言,我是这样做的。
{% if request.META.HTTP_HOST == "127.0.0.1:8000" %}
这将始终工作,而不是依靠DEBUG标志和INTERNAL_IP,它只是为硬编码的IP工作。
您将需要将DEBUG
标志添加到您的context_processors
。
甚至可能没有其他办法。 至less,没有我所知道的。