Come controllare la TEMPLATE_DEBUG di bandiera in un django modello?

Sapete se è possibile sapere in un django modello se il TEMPLATE_DEBUG flag è impostato?

Vorrei disattivare google analytics script quando sono in esecuzione la mia app django sulla mia macchina di sviluppo. Qualcosa di simile a un {% if debug %} template tag sarebbe perfetto. Purtroppo, non sono riuscito a trovare qualcosa di simile nella documentazione.

Per certo, posso aggiungere questo flag per il contesto, ma vorrei sapere se c’è un modo migliore per farlo.

InformationsquelleAutor luc | 2009-08-13



6 Replies
  1. 69

    Supponendo che non hai impostato TEMPLATE_CONTEXT_PROCESSORS a qualche altro valore in settings.py, Django caricherà automaticamente il debug contesto del preprocessore (come indicato qui). Questo significa che si avrà accesso ad una variabile chiamata debug nei modelli se settings.DEBUG è vero e locale indirizzo IP della macchina (che può semplicemente essere 127.0.0.1) è impostato nella variabile settings.INTERNAL_IPS (che è descritto qui). settings.INTERNAL_IPS è una tupla o di un elenco di indirizzi IP che Django dovrebbe riconoscere come “interno”.

    • Sembra che corrispondono al mio bisogno, ma purtroppo non funziona per me. Non riesco a trovare ciò che è sbagliato.
    • Che funziona perfettamente come un lungo io uso un RequestContext piuttosto che di un Contesto. Grazie mille!
    • Oops, scusate! Ho dimenticato di dire che devi passare un RequestContext per il modello.
    • Come si fa a controllare nel modello? Secondo la documentazione, ifequal è insufficiente: è possibile confrontare un argomento di variabili di modello o di stringhe. Non è possibile verificare l’uguaglianza con gli oggetti Python come Vero o Falso. Se avete bisogno di controllare se qualcosa è vero o falso, usi se i tag invece. Comunque, {% if %} non funziona. Verifica esistenza, non se sia Vero o Falso.
    • Il if tag dovrebbe di lavoro. Da Django docs: “Il {% if %} tag restituisce una variabile, e se tale variabile è “vero” (cioè esiste, non è vuoto, e non è un falso valore booleano) il contenuto del blocco sono uscita.”
    • Dovrebbe essere TEMPLATE_CONTEXT_PROCESSORS, no?
    • Infatti. Aggiornato.

  2. 53

    Se la modifica INTERNAL_IPS non è possibile/adatto, si può fare questo con un contesto processore:

    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',
    )

    Quindi nel mio template, si può semplicemente:

     {% if DEBUG %} .header { background:#f00; } {% endif %}
    • Non ho trovato alcuna doc per questo, e non sembra essere necessario, prima di django 1.6.. trovo che questo sia un po ‘ vecchio, qualsiasi spiegazione ? Ho bisogno di caricare qualsiasi impostazione specifica per il contesto ? Questo non è molto conveniant penso.. Grazie per il consiglio, però
  3. 19

    Django 1.9

    settings.py:

    INTERNAL_IPS = (
        '127.0.0.1',
    )

    Modelli:

    {% if debug %}

    https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-INTERNAL_IPS dice:

    Un elenco di indirizzi IP, come le stringhe, che:

    • Consentire il debug() contesto processore per aggiungere variabili al modello di contesto.

    Il debug contesto processore è in default settings.py.

    • Questa è una buona soluzione o piuttosto un hacky soluzione?
    • l’intero Django è senza dubbio un hack! 🙂 (Penso che va bene, ma io non sono al 100%)
    • woking bene con django 2.1.8
  4. 5

    Se non l’hai già fatto, è sempre utile per vedere se/come altri hanno affrontato con lo stesso problema su djangosnippets. L’ultima funzionante con analytics tag è 1656:
    http://www.djangosnippets.org/snippets/1656/

    Ciò che è bello di questa soluzione è che permette di mantenere il vostro GOOGLE_ANALYTICS_CODE = xxxxxx in local_settings.py nel caso di sorgente è pubblico, la chiave rimane privato. In aggiunta va un ulteriore passo per non utilizzare google analytics per gli utenti registrati.

    Include il Javascript di Google Analytics. Non mostrare il codice di Google Analytics in fase di DEBUG è o per il personale degli utenti.

    Utilizzare {% googleanalyticsjs %} nel template.

    Si deve impostare qualcosa di simile

    GOOGLE_ANALYTICS_CODE = "UA-1234567-1"

    nel file di impostazioni.

    Presuppone un “utente”, nel modello le variabili è request.user, che sarà, se si utilizza:

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

    (Supponendo django.core.context_processors.auth è in TEMPLATE_CONTEXT_PROCESSORS, che è di default)


    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. 4

    {% if debug %} può fare il trucco, ma solo se si passa RequestContext invece di Context. Inoltre, debug non è un flag booleano, è una funzione che, se valutato mentre DEBUG = True tornare un po ‘ di informazioni di debug. Questo può essere un inutile sovraccarico per il tuo modello.

    Personalmente, faccio questo trucco invece.

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

    Questo funziona sempre, ma invece di basarsi su entrambi i flag di DEBUG e INTERNAL_IP, è solo il lavoro per l’hard coded IP.

    • Meglio spostarlo a modello per il tag takes_context=True per non violare SECCO.
  6. 0

    Sarà necessario aggiungere il DEBUG bandiera per la vostra context_processors.

    Ci può anche non essere un modo alternativo. Almeno, nessuno che io sappia.

Lascia un commento