web-dev-qa-db-fra.com

Comment vérifier l'indicateur TEMPLATE_DEBUG dans un modèle Django?

Savez-vous s'il est possible de savoir dans un modèle Django si l'indicateur TEMPLATE_DEBUG est défini?

Je souhaite désactiver mon script Google Analytics lorsque j'exécute mon application Django sur ma machine de développement. Quelque chose comme une balise de modèle {% if debug%} serait parfait. Malheureusement, je n'ai pas trouvé quelque chose comme ça dans la documentation.

Bien sûr, je peux ajouter cet indicateur au contexte, mais j'aimerais savoir s'il existe une meilleure façon de le faire.

57
luc

En supposant que vous n’ayez pas défini TEMPLATE_CONTEXT_PROCESSORS avec une autre valeur dans settings.py, Django chargera automatiquement le préprocesseur de contexte debug (comme indiqué ici ). Cela signifie que vous aurez accès à une variable appelée debug dans vos modèles sisettings.DEBUG est vrai et l'adresse IP de votre ordinateur local (qui peut simplement être 127.0.0.1) est définie dans la variable settings.INTERNAL_IPS (qui est décrit ici ). settings.INTERNAL_IPS est un tuple ou une liste d'adresses IP que Django devrait reconnaître comme "internes".

69
mipadi

Si modifier INTERNAL_IPS n'est pas possible/approprié, vous pouvez le faire avec un processeur de contexte:

dans myapp/context_processors.py:

from Django.conf import settings

def debug(context):
  return {'DEBUG': settings.DEBUG}

dans settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'myapp.context_processors.debug',
)

Puis dans mes modèles, simplement:

 {% if DEBUG %} .header { background:#f00; } {% endif %}
53
fredley

Django 1.9

settings.py:

INTERNAL_IPS = (
    '127.0.0.1',
)

Modèles:

{% if debug %}

https://docs.djangoproject.com/fr/1.9/ref/settings/#std:setting-INTERNAL_IPS dit:

Une liste d'adresses IP, sous forme de chaînes, qui:

  • Autorisez le processeur de contexte debug () à ajouter des variables au contexte du modèle.

Le processeur de contexte debug est dans le settings.py par défaut.

Si vous ne l'avez pas déjà fait, il est toujours utile de voir si/comment d'autres ont traité le même problème sur djangosnippets. L’extrait le plus récent utilisant la balise analytique est 1656: http://www.djangosnippets.org/snippets/1656/

Ce qui est bien avec cette solution, c’est qu’elle vous permet de conserver votre GOOGLE_ANALYTICS_CODE = xxxxxx dans local_settings.py si le reste de votre source est public, votre clé reste privée. De plus, éviter les analyses pour les utilisateurs connectés est une étape supplémentaire.

Inclut le Javascript pour Google Analytics. N'affichera pas le code Google Analytics lorsque DEBUG est activé ou aux utilisateurs du personnel.

Utilisez {% googleanalyticsjs %} dans vos modèles.

Vous devez définir quelque chose comme

GOOGLE_ANALYTICS_CODE = "UA-1234567-1"

dans votre fichier de paramètres.

Supposons que 'utilisateur' dans vos variables de modèle est request.user, ce qui sera le cas si vous utilisez:

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

(En supposant que Django.core.context_processors.auth est dans TEMPLATE_CONTEXT_PROCESSORS, ce qui est par défaut)


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
Thomas Schreiber

{% if debug %} peut faire l'affaire mais seulement si vous passez RequestContext au lieu de Context. De plus, debug n'est pas un indicateur booléen, c'est une fonction qui, lorsqu'elle est évaluée pendant que DEBUG = True renvoie des informations de débogage. Cela peut être inutile pour votre modèle.

Personnellement, je fais ce truc à la place.

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

Cela fonctionnera toujours, mais au lieu de s’appuyer à la fois sur l’indicateur DEBUG et sur INTERNAL_IP, cela fonctionne uniquement pour l’IP codée en dur.

4
Ramast

Vous devrez ajouter le drapeau DEBUG à votre context_processors.

Il n’ya peut-être même pas d’autre solution. Du moins, à ma connaissance.

0
Lakshman Prasad