web-dev-qa-db-fra.com

meilleur endroit pour effacer le cache lors du redémarrage du serveur Django

Je veux que Memcached soit vidé à chaque redémarrage/recharge du serveur Django. J'utilise cherrypy pour la production et le serveur intégré pour le développement.

J'ajouterais ceci à settings.py, juste après CACHES:

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

mais cela fait une importation récursive:

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

D'autres suggestions? Merci.

24

C'est une mauvaise pratique de mettre du code dans settings.py autre que des assignations. Cela convient mieux comme commande de gestion:

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

Ce que vous pouvez ajouter à votre projet en le collant dans someapp/management/commands. Par exemple, vous pouvez créer une nouvelle application appelée utils et l'ajouter à votre INSTALLED_APPS et la structure de répertoires ressemblerait à ceci:

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

Vous pouvez maintenant vider le cache en faisant ./manage.py clearcache. Si vous voulez exécuter clearcache à chaque fois que vous utilisez un serveur, vous pouvez simplement écrire un alias Shell pour le faire:

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

Alternativement, je pense que vous pouvez l'écrire en tant que script autonome et configurer les paramètres nécessaires à la main :

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

Écrire votre script autonome de cette manière empêchera les importations circulaires et vous permettra de l'importer à partir de votre fichier settings.py. Bien que rien ne garantisse que settings.py sera importé une seule fois, je l’éviterai donc en général. Ce serait bien si le cadre du signal pouvait déclencher un événement une fois à chaque démarrage de l'application, une fois les paramètres chargés pour des éléments comme celui-ci.

53
zeekay

Django Extensions vous permet d’effacer le cache via 

manage.py clear_cache

more info et many commandes supplémentaires dans leurs docs .

3
andyw

En règle générale, vous ne devez pas invalider vos caches si le code change de manière à nécessiter un nouveau cache. Pas sur tous les restart.

Ceci est mieux géré en utilisant la fonctionnalité Django: settings.CACHES.VERSION [1], et augmentez ce nombre chaque fois que vous modifiez le code qui modifie le format des données mises en cache. Ainsi, lors d’un déploiement, vous utiliserez automatiquement un cache neuf lorsque vous déployez du nouveau code, mais conservez le cache si votre code est compatible avec le cache précédent.

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

0
harmv

Que dis-tu de ça? Définissez une valeur booléenne dans settings.py, par exemple CLEAR_CACHE_ON_RESTART = True, puis cochez-la à un autre emplacement s'il s'agit de True. Si c'est le cas, effacez le cache et définissez-le sur False. Ce code peut être placé dans n’importe quelle vue (comme une vue principale) et probablement même dans manage.py ou urls.py (bien que je n’aie pas vérifié cela et que cela ne soit pas très beau). Essaie!

0
freakish