Django template.loaders.cached Loader について


Local 環境で、Django Template の編集 デバッグをしていて、
Template ファイル編集後に、毎回

python manage.py runserver 
でサーバーを再起動しないと、反映されず、「こんなはずではなかった」と思ったので、
記載します。


前提 環境情報

  • OS

    sw_vers
    -----------------------
    ProductName:    Mac OS X
    ProductVersion: 10.12.5
    BuildVersion:   16F73
    -----------------------
    

  • python version

    python3 -V
    -----------------------
    Python 3.5.1
    -----------------------
    

  • Django Version

    pip3 list | grep Django
    -----------------------
    Django (1.10.7)
    -----------------------
    


原因 と 対策

Django のガイドに記載がありますが、
Python プログラマのための Django テンプレート言語ガイド — Django 1.4 documentation

django.template.loaders.cached.Loader というテンプレートローダ があります。
ローカル環境構築時に、記載の意味を忘れて、settings.py 内の以下の記述をコピーしていたため、
テンプレートがキャッシュされるようになっていました。

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [
            os.path.join(PROJECT_ROOT, "templates"),
            os.path.join(PROJECT_ROOT, "amp_mobile/templates"),
        ],
        "OPTIONS": {
            "context_processors": [
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
                "django.template.context_processors.debug",
                "django.template.context_processors.i18n",
                "django.template.context_processors.static",
                "django.template.context_processors.media",
                "django.template.context_processors.request",
                "django.template.context_processors.tz",
                "mezzanine.conf.context_processors.settings",
                "mezzanine.pages.context_processors.page",
            ],
            "builtins": [
                "mezzanine.template.loader_tags",
            ],
            "loaders": [
            ('django.template.loaders.cached.Loader', [
              'django.template.loaders.filesystem.Loader',
              'django.template.loaders.app_directories.Loader',
              ]),
            ],
        },
    },
]

以下、記述を削除すると、デフォルトのローダが使われ、キャッシュされなくなり、編集後に即時反映されるようになります。

    "loaders": [
    ('django.template.loaders.cached.Loader', [
      'django.template.loaders.filesystem.Loader',
      'django.template.loaders.app_directories.Loader',
      ]),
    ],

ちなみにこの場合、以下のようにアプリケーションのテンプレートディレクトリを追加していたため、

    "DIRS": [
        os.path.join(PROJECT_ROOT, "templates"),
        os.path.join(PROJECT_ROOT, "amp_mobile/templates"),
    ],

    "APP_DIRS": True,
がないと、テンプレートが見えず、エラーとなりました。

以上です。

コメント