2010-12-01 3 views
20

私のプロジェクトのpythonソースファイルで修正を加えると、Djangoはそれを検出してrunserver自体を再起動します。しかし、私がdjangoテンプレートを変更すると、runserverをkillして再起動する必要があります。テンプレートの変更時にrunserverを自動的に再起動させるにはどうすればいいですか?テンプレート変更時にDjangoを再起動するrunserverを作成するには?

答えて

16

ファイルはデフォルトですべての要求時にディスクから読み込まれるため、何も再起動する必要はありません。

キャッシングテンプレートローダーがありますが、デフォルトでは無効になっています。詳細はthe documentationを参照してください。 、あなたが直面している問題は、正確にあなたが何をする必要があるか、すべてが次のようにsettings.pyファイルでそれを無効にすることであるFetchFromCacheMiddlewareによって引き起こされるknutinの答えに追加するには

+1

設定では、テンプレートのキャッシュを設定しています。そこで、 'django.template.loaders.cached.Loader'( 'django.template.loaders.app_directories.Loader'))を 'django.template.loaders.app_directories.Loader'で置き換えて、 を置き換えました。多くのお礼ありがとうございます – Eric

+1

私は通常のテンプレートでこの問題を抱えていません(デフォルト設定が使用されています)。しかし、私はこの問題をcrispyformsオーバーライドで解決しています。 (再起動すると更新されます)。これは、crispyformsテンプレートがテンプレートタグ内から読み込まれるためだと私は信じています。ここで起こっていることは何ですか? –

+2

crispyformsテンプレートを再起動する必要があるのは、テンプレートをキャッシュするためにmemoize()関数を使用するという理由が考えられます。 devモードでこれを無効にする方法はありません。混乱を招く可能性があります。 Djangoのソースを見ると、memoize()が使用されている唯一の場所はパターンを格納することです。なぜなら、URLを変更するとrunserverが再起動する必要があるからです。 –

6

touchをPythonソースファイルの1つに対して実行します。

runserverは.pyファイルの変更を監視するため、テンプレート(.html)の変更で再起動しません。 touchコマンドを使用して.pyファイルを仮想的に編集することで、この再起動をトリガーすることができます。このコマンドは、日付を更新し、他のすべての内容を同じにします。

+0

OPは既に彼がPythonのソースファイルを編集したと言いました。私は何が変わるのか分かりません。 – metakermit

+2

@ kermit666:いいえ、彼はテンプレートを編集したと言いました。テンプレートはPythonソースファイルではありません。 –

+0

OK、そうです、私の間違いです。私はそれがロック解除されると、下院投票を取り下げます。メソッドはまだ私の味のためにあまりにもハッキリです:)理想的には、grunt-contrib-watchとDjangoのrunserverの間に良い統合があります。 – metakermit

5

settings.py:

MIDDLEWARE_CLASSES = (
    ... 
    #'django.middleware.cache.FetchFromCacheMiddleware', 
    ... 
) 
0

私のテンプレートでは、それらを更新するために実行するdjangoマネージャスクリプトが必要でしたが、同様の問題がありました。 djangoが他のファイルタイプを見るのを簡単にする方法はありませんが、ここでは私が使用している回避策があります。

これは私が今のdevのサーバーを実行するために使用するスタンドアロンスクリプトです:

#!/usr/bin/python 

import time, subprocess, sys, os, re 
from threading import Thread 

run = True 

def monitor(): 
    while run: 
    os.system("./manage.py update_templates") 
    os.system("touch website/urls.py") 
    os.system("inotifywait -e modify,create,delete website/templates/*.html") 

t = Thread(target=monitor) 
t.start() 
time.sleep(0.5) 

args = '' 
if len(sys.argv) > 1: 
    for i in range(1, len(sys.argv)): 
    args += sys.argv[i] +' ' 
print("./manage.py runserver %s" % args) 
os.system("./manage.py runserver %s" % args) 
run = False 
t.join() 

このスクリプトは、以下の仮定の下で動作します。このスクリプトは、側面に沿って配置されているのpython3

  • を使用して

    1. manager.py
    2. manager.pyが実行可能です
    3. ウェブアプリケーションはウェブサイト
    4. ウェブサイトは、あなたは、ファイルだけで作る、そのrunserverを再起動することなく、ディスクから読み込まれます
  • 0

    inotifyをサポートしていますGNU/Linuxのを、使用している

  • ウェブサイト/ urls.pyというファイルがあります必ずすべてのキャッシングを無効にしてください。

    キャッシュされたテンプレートローダはデフォルトでは有効になっていませんが、あなたは、生産の設定でこれを有効にしている可能性がキャッシュされたテンプレートローダ

    を無効にします。キャッシュされたテンプレートローダーが開発設定を有効にしていないことを確認してください。 Django docs on the cached template loader

    あなたはDjangoのキャッシュフレームワークを使用している場合は、これはリロードしないテンプレートを引き起こす可能性がありますダミーのキャッシングフレームワーク

    を使用してください。Djangoが使うデフォルトのフレームワークは、ローカルメモリキャッシュです。つまり、キャッシングフレームワークを無効にするためにダミーキャッシュを明示的に設定する必要があります。 Django docs on dummy caching

  • 1

    テンプレートの変更をリロードするためにサーバーを再起動する必要はありません。

    生産では、あなたがこれを行うことがあります。
    をsettings.pyでは、テンプレート設定
    のために -
    設定APP_DIRS削除 - その代わりに、OPTIONSにこの設定を追加します。

    'loaders': [ 
        'django.template.loaders.filesystem.Loader', 
        'django.template.loaders.app_directories.Loader', 
    ], 
    

    なぜこの作品を:
    デフォルトでDEBUGの設定はTrue(開発モード)です。このモードでは、Djangoはテンプレートをキャッシュしません。しかし、生産モード(すなわち、DEBUG = False)では、Djangoはテンプレートキャッシングを可能にする。したがって、編集/タッチされたテンプレートをリロードするには、サーバーを再起動する必要があります。

    注: プロダクションマシンでテンプレートキャッシュを無効にすると、通過するリクエストごとにオーバーヘッドが追加されることに注意してください。