лучшее место для очистки кэша при перезапуске сервера django - PullRequest
26 голосов
/ 10 мая 2011

Я хочу, чтобы 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's causing an ImportError somehow.)
make: *** [server] Error 1

Есть еще предложения?Спасибо.

Ответы [ 4 ]

55 голосов
/ 10 мая 2011

Неправильно помещать код в 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 будет импортирован только один раз, так что в целом я бы этого избегал.Было бы хорошо, если бы сигнальная структура могла запускать событие один раз при каждом запуске приложения, после загрузки настроек для подобных вещей.

5 голосов
/ 25 апреля 2017

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

manage.py clear_cache

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

1 голос
/ 30 января 2018

Обычно вы не хотите делать недействительными ваши кеши, если код изменяется таким образом, что требуется новый кеш.Не включен каждый перезапуск.

Лучше всего это использовать с помощью функции Django: settings.CACHES.VERSION [1], и увеличивайте это число каждый раз, когда вы меняете код, изменяющий формат кэшированногоданные.Таким образом, при развертывании вы автоматически будете использовать новый кеш при развертывании нового кода, но сохраняйте кеш, если ваш код совместим с предыдущим кодом.

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

0 голосов
/ 10 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...