it-swarm.com.de

der beste Platz zum Löschen des Caches, wenn der Django-Server neu gestartet wird

Ich möchte, dass memcached bei jedem Neustart/Neuladen des Django-Servers geleert wird. Ich verwende Cherrypy für die Produktion und integrierte Server für die Entwicklung.

Ich würde dies zu settings.py gleich nach CACHES hinzufügen:

from Django.core.cache import cache
cache.clear()

aber es macht einen rekursiven Import:

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

Irgendwelche anderen Vorschläge? Vielen Dank.

24

Es ist nicht empfehlenswert, Code in settings.py einzugeben, außer Zuweisungen. Es ist besser als Verwaltungsbefehl geeignet:

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

Welches können Sie zu Ihrem Projekt hinzufügen, indem Sie es in someapp/management/commands einfügen. Sie könnten zum Beispiel eine neue App mit dem Namen utils erstellen und diese zu Ihrem INSTALLED_APPS hinzufügen, und die Verzeichnisstruktur würde folgendermaßen aussehen:

utils
├── __init__.py
└── management
    ├── __init__.py
    └── commands
        ├── __init__.py
        └── clearcache.py

Sie können den Cache jetzt löschen, indem Sie ./manage.py clearcache ausführen. Wenn Sie clearcache bei jedem Runserver ausführen möchten, schreiben Sie einfach einen Shell-Alias, um dies auszuführen:

alias runserver='./manage.py clearcache && ./manage.py runserver'

Alternativ denke ich, Sie können es als eigenständiges Skript schreiben und die erforderlichen Einstellungen per Hand konfigurieren :

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

Wenn Sie Ihr eigenständiges Skript so schreiben, werden Umlaufimporte verhindert und Sie können es aus Ihrer settings.py importieren. Obwohl es keine Garantie gibt, dass settings.py nur einmal importiert wird, würde ich dies generell vermeiden. Es wäre schön, wenn das Signalgerüst bei jedem Start der App ein Ereignis auslösen könnte, nachdem Einstellungen für solche Dinge geladen wurden.

53
zeekay

Django Extensions lässt Sie den Cache über löschen 

manage.py clear_cache

weitere Informationen und viele weitere Befehle in ihren docs .

3
andyw

Normalerweise werden Sie Ihre Caches nicht für ungültig erklären, wenn sich der Code so ändert, dass ein neuer Cache erforderlich ist. Nicht bei alle neu starten.

Dies geschieht am besten mit der Django-Funktion: settings.CACHES.VERSION [1]. Erhöhen Sie diese Zahl jedes Mal, wenn Sie den Code ändern, der das Format der zwischengespeicherten Daten ändert. Auf diese Weise verwenden Sie bei einer Bereitstellung automatisch eine Neuer Cache, wenn Sie neuen Code bereitstellen, aber den Cache beibehalten, wenn der Code mit dem vorherigen Code Cache-kompatibel ist.

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

0
harmv

Wie wäre es damit? Definieren Sie in settings.py einen booleschen Wert, beispielsweise CLEAR_CACHE_ON_RESTART = True, und prüfen Sie an anderer Stelle, ob es sich um True handelt. Wenn ja, löschen Sie den Cache und setzen Sie ihn auf False. Dieser Code kann in jede Ansicht (wie eine Hauptansicht) und wahrscheinlich sogar in manage.py oder urls.py eingefügt werden (obwohl ich dies nicht geprüft habe und es nicht besonders gut aussieht). Versuche es!

0
freakish