Wissen Sie, ob es möglich ist, in einer Django-Vorlage zu wissen, ob das Flag TEMPLATE_DEBUG gesetzt ist?
Ich möchte mein Google Analytics-Skript deaktivieren, wenn ich meine Django-App auf meinem Entwicklungscomputer ausführen möchte. So etwas wie ein {% if debug%} Template-Tag wäre perfekt. Leider habe ich so etwas in der Dokumentation nicht gefunden.
Natürlich kann ich dieses Flag zum Kontext hinzufügen, aber ich würde gerne wissen, ob es einen besseren Weg gibt, dies zu tun.
Vorausgesetzt, Sie haben TEMPLATE_CONTEXT_PROCESSORS
nicht auf einen anderen Wert in settings.py
gesetzt, lädt Django automatisch den Kontextprozessor debug
(wie hier ). Dies bedeutet, dass Sie auf eine Variable namens debug
in Ihren Vorlagen zugreifen können, wennsettings.DEBUG
true ist und die IP-Adresse Ihres lokalen Computers (die einfach 127.0.0.1 sein kann) in der Variablen settings.INTERNAL_IPS
(welche wird hier ) beschrieben. settings.INTERNAL_IPS
ist ein Tuple oder eine Liste von IP-Adressen, die Django als "intern" erkennen soll.
Wenn das Ändern von INTERNAL_IPS
nicht möglich/geeignet ist, können Sie dies mit einem Kontextprozessor tun:
in myapp/context_processors.py
:
from Django.conf import settings
def debug(context):
return {'DEBUG': settings.DEBUG}
in settings.py
:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.debug',
)
Dann in meinen Vorlagen einfach:
{% if DEBUG %} .header { background:#f00; } {% endif %}
Django 1.9
einstellungen.py:
INTERNAL_IPS = (
'127.0.0.1',
)
Vorlagen:
{% if debug %}
https://docs.djangoproject.com/de/1.9/ref/settings/#std:setting-INTERNAL_IPS sagt:
Eine Liste von IP-Adressen als Zeichenfolgen, die:
- Erlauben Sie dem Debug () - Kontextprozessor, einige Variablen zum Vorlagenkontext hinzuzufügen.
Der Kontextprozessor debug
befindet sich im Standardcode settings.py
.
Wenn Sie es noch nicht getan haben, ist es immer hilfreich zu sehen, ob und wie andere mit djangosnippets dasselbe Problem behandelt haben. Das aktuellste Snippet, das mit dem Analytics-Tag arbeitet, ist 1656: http://www.djangosnippets.org/snippets/1656/
Das Schöne an dieser Lösung ist, dass Sie Ihren GOOGLE_ANALYTICS_CODE = xxxxxx
in local_settings.py behalten können, falls der Rest Ihrer Quelle öffentlich ist. Ihr Schlüssel bleibt privat. Darüber hinaus ist es ein zusätzlicher Schritt, keine Analyse für angemeldete Benutzer zu verwenden.
Enthält das Javascript für Google Analytics. Zeigt keinen Google Analytics-Code an, wenn DEBUG aktiviert ist oder für Mitarbeiter der Mitarbeiter.
Verwenden Sie
{% googleanalyticsjs %}
in Ihren Vorlagen.Du musst sowas einstellen
GOOGLE_ANALYTICS_CODE = "UA-1234567-1"
in Ihrer Einstellungsdatei.
Es wird davon ausgegangen, dass "user" in Ihren Vorlagenvariablen
request.user
ist.return render_to_response('template.html',{ }, context_instance=RequestContext(request))
(Angenommen,
Django.core.context_processors.auth
befindet sich inTEMPLATE_CONTEXT_PROCESSORS
(standardmäßig).)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 %}
kann den Trick aber nur, wenn Sie RequestContext
anstelle von Context
übergeben. Außerdem ist debug
kein boolesches Flag, sondern eine Funktion, die bei der Auswertung von DEBUG = True
einige Debugging-Informationen zurückgibt. Dies kann unnötiger Aufwand für Ihre Vorlage sein.
Ich persönlich mache diesen Trick stattdessen.
{% if request.META.HTTP_Host == "127.0.0.1:8000" %}
Dies wird immer funktionieren, aber anstatt sich sowohl auf das DEBUG-Flag als auch auf INTERNAL_IP zu verlassen, funktioniert es nur für die hart codierte IP.
Sie müssen das DEBUG
-Flag zu Ihrem context_processors
hinzufügen.
Es kann nicht einmal einen alternativen Weg geben. Zumindest keine, die ich kenne.