Djangoサーバーの再起動/再読み込みのたびにmemcachedをフラッシュしたいのです。本番環境にはcherrypyを、開発には組み込みサーバーを使用します。
これを、CACHESの直後のsettings.pyに追加します。
from Django.core.cache import cache
cache.clear()
しかし、それは再帰的なインポートを行います:
Error: Can't find the file 'settings.py' in the directory containing 'manage.py'. It appears you've customized things.
You'll have to run Django-admin.py, passing it your settings module.
(If the file settings.py does indeed exist, it's causing an ImportError somehow.)
make: *** [server] Error 1
他に何か提案はありますか?ありがとう。
割り当て以外のコードをsettings.py
に配置することは悪い習慣です。管理コマンドとして適しています。
from Django.core.management.base import BaseCommand
from Django.core.cache import cache
class Command(BaseCommand):
def handle(self, *args, **kwargs):
cache.clear()
self.stdout.write('Cleared cache\n')
someapp/management/commands
に貼り付けることでプロジェクトに追加できます。たとえば、utils
という新しいアプリを作成してINSTALLED_APPS
に追加すると、ディレクトリ構造は次のようになります。
utils
├── __init__.py
└── management
├── __init__.py
└── commands
├── __init__.py
└── clearcache.py
./manage.py clearcache
を実行して、キャッシュをクリアできるようになりました。サーバーを実行するたびにclearcacheを実行したい場合は、シェルエイリアスを記述してそれを実行できます。
alias runserver='./manage.py clearcache && ./manage.py runserver'
あるいは、スタンドアロンスクリプトとして記述し、 手動で必要な設定を構成できると思います :
from Django.conf import settings
# obviously change CACHES to your settings
CACHES = {
'default': {
'BACKEND': 'Django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake'
}
}
settings.configure(CACHES=CACHES) # include any other settings you might need
from Django.core.cache import cache
cache.clear()
このようなスタンドアロンスクリプトを作成すると、循環インポートが防止され、settings.pyからインポートできるようになります。 settings.pyが一度だけインポートされるという保証はありませんが、一般的にはこれを避けます。このような設定が読み込まれた後、信号フレームワークがアプリを起動するたびに1回イベントを発生させることができればいいですね。
新しいキャッシュを必要とする方法でコードが変更された場合、通常はキャッシュを無効にしないでください。 毎回再起動しない。
Django機能:settings.CACHES.VERSION
[1]、そしてキャッシュされたデータのフォーマットを変更するコードを変更するたびにその数を増やします。そうすることで、デプロイ時に新しいコードをデプロイするときに新しいキャッシュが自動的に使用されますが、コードが以前のコードとキャッシュ互換である場合はキャッシュを保持します。
[1]( https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-CACHES-VERSION )
これはどう? settings.py
にブール値を定義します(例:CLEAR_CACHE_ON_RESTART = True
)。次に、それがTrue
かどうかを他の場所で確認します。そうであれば、キャッシュをクリアしてFalse
に設定します。このコードは、任意のビュー(メインビューなど)に配置でき、おそらくmanage.py
またはurls.py
にも配置できます(ただし、これをチェックしなかったため、見栄えがよくありません)。試してみる!
複数のキャッシュバックエンドがある場合、Django.core.cache.cache.clear()
はデフォルトのキャッシュのみをクリアします。 clear_cache
コマンドは、すべてのバックエンドからキャッシュをクリアします。次のコマンドを使用する必要があります。
from Django.conf import settings
from Django.core.cache import caches
from Django.core.management.base import BaseCommand
class Command(BaseCommand):
help = "Clear cache"
def handle(self, **options):
for k in settings.CACHES.keys():
caches[k].clear()
self.stdout.write("Cleared cache '{}'.\n".format(k))