wake-up-neo.com

Wie prüfe ich das TEMPLATE_DEBUG-Flag in einer Django-Vorlage?

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.

57
luc

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.

69
mipadi

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 %}
53
fredley

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 in TEMPLATE_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)
5

{% 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.

4
Ramast

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.

0
Lakshman Prasad