web-dev-qa-db-ja.com

再起動時にキャッシュをクリアするのに最適な場所Djangoサーバー

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

他に何か提案はありますか?ありがとう。

27

割り当て以外のコードを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回イベントを発生させることができればいいですね。

55
zeekay

Django Extensions を使用すると、キャッシュをワイプできます

manage.py clear_cache

詳細およびmanyその他のコマンド docs

6
andyw

新しいキャッシュを必要とする方法でコードが変更された場合、通常はキャッシュを無効にしないでください。 毎回再起動しない。

Django機能:settings.CACHES.VERSION [1]、そしてキャッシュされたデータのフォーマットを変更するコードを変更するたびにその数を増やします。そうすることで、デプロイ時に新しいコードをデプロイするときに新しいキャッシュが自動的に使用されますが、コードが以前のコードとキャッシュ互換である場合はキャッシュを保持します。

[1]( https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-CACHES-VERSION

1
harmv

これはどう? settings.pyにブール値を定義します(例:CLEAR_CACHE_ON_RESTART = True)。次に、それがTrueかどうかを他の場所で確認します。そうであれば、キャッシュをクリアしてFalseに設定します。このコードは、任意のビュー(メインビューなど)に配置でき、おそらくmanage.pyまたはurls.pyにも配置できます(ただし、これをチェックしなかったため、見栄えがよくありません)。試してみる!

0
freakish

複数のキャッシュバックエンドがある場合、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))
0
Antoine Pinsard