web-dev-qa-db-ja.com

DjangoテンプレートでTEMPLATE_DEBUGフラグを確認する方法は?

TEMPLATE_DEBUGフラグが設定されている場合、Djangoテンプレートで知ることができるかどうか知っていますか?

開発マシンでDjangoアプリを実行しているときにGoogleアナリティクススクリプトを無効にしたいと思います。{%if debug%}テンプレートタグのようなものは完璧でしょう。残念ながら、私はしませんでしたドキュメントでそのようなものを見つけます。

確かに、このフラグをコンテキストに追加できますが、それを行うより良い方法があるかどうか知りたいです。

58
luc

TEMPLATE_CONTEXT_PROCESSORSsettings.pyの他の値に設定していないと仮定すると、Djangoは自動的にdebugコンテキストプリプロセッサーをロードします( here )。これは、テンプレートのdebugという変数にアクセスできることを意味しますifsettings.DEBUGがtrueandローカルマシンのIPアドレス(単純に127.0.0.1になります)は、変数settings.INTERNAL_IPShere で説明)に設定されます。 settings.INTERNAL_IPSは、Djangoが「内部」として認識する必要があるIPアドレスのタプルまたはリストです。

69
mipadi

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

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 言います:

文字列としてのIPアドレスのリスト:

  • Debug()コンテキストプロセッサがテンプレートコンテキストにいくつかの変数を追加できるようにします。

debugコンテキストプロセッサはデフォルトのsettings.py

まだ行っていない場合は、他の人がdjangosnippetsで同じ問題に対処したかどうか/どのように対処したかを常に確認するのに役立ちます。分析タグで動作する最新のスニペットは1656です。 http://www.djangosnippets.org/snippets/1656/

このソリューションの優れている点は、GOOGLE_ANALYTICS_CODE = xxxxxx local_settings.pyで、ソースの残りがパブリックの場合、キーはプライベートのままです。さらに、ログインしているユーザーに分析を使用しないようにするには、追加の手順を実行します。

Google AnalyticsのJavascriptが含まれています。 DEBUGがオンになっている場合、またはユーザーにスタッフがいる場合、Googleアナリティクスコードは表示されません。

使用する {% googleanalyticsjs %}テンプレートに。

次のように設定する必要があります

GOOGLE_ANALYTICS_CODE = "UA-1234567-1"

設定ファイルで。

テンプレート変数の「ユーザー」はrequest.user、使用する場合:

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

Django.core.context_processors.authTEMPLATE_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)
5

{% if debug %}は、RequestContextの代わりにContextを渡す場合にのみ、トリックを実行できます。さらに、debugはブールフラグではなく、DEBUG = Trueいくつかのデバッグ情報を返します。これは、テンプレートの不要なオーバーヘッドになる可能性があります。

個人的に、私は代わりにこのトリックを行います。

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

これは常に機能しますが、DEBUGフラグとINTERNAL_IPの両方に依存する代わりに、ハードコードされたIPに対してのみ機能します。

4
Ramast

DEBUGフラグをcontext_processorsに追加する必要があります。

別の方法さえないかもしれません。少なくとも、私が知っていることはありません。

0
Lakshman Prasad