Подтвердить что ты не робот

Лучшее место для очистки кеша при перезапуске сервера django

Я хочу, чтобы memcached был очищен при каждом перезагрузке/перезагрузке сервера django. Я использую cherrypy для производства и встроенного сервера для разработки.

Я бы добавил это в settings.py, сразу после CACHES:

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 causing an ImportError somehow.)
make: *** [server] Error 1

Любые другие предложения? Спасибо.

4b9b3361

Ответ 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'

В качестве альтернативы, я думаю, вы можете записать его как автономный script и настроить необходимые ему параметры вручную:

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()

Написание автономного script, как это, предотвратит циклический импорт и позволит вам импортировать его из параметров settings.py. Хотя нет никакой гарантии, что settings.py будет импортироваться только один раз, так что в общем я бы избегал этого. Было бы неплохо, если бы инфраструктура сигнала могла запускать событие каждый раз, когда приложение запускается, после того как настройки загружаются для таких вещей.

Ответ 2

Расширения Django позволяет стереть кеш через

manage.py clear_cache

больше информации и многие другие команды в docs.

Ответ 3

Как насчет этого? Определите логическое значение в settings.py, например CLEAR_CACHE_ON_RESTART = True, а затем проверьте другое место, если оно True. Если это так, то очистите кеш и установите его на False. Этот код можно разместить в любом представлении (например, в главном представлении) и, возможно, даже в manage.py или urls.py (хотя я не проверял это, и он выглядит не слишком хорошо). Попробуйте!