重新启动 django 服务器时清除缓存的最佳位置

问题描述 投票:0回答:6

我希望每次重新启动/重新加载 django 服务器时都会刷新 memcached。我使用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

还有其他建议吗?谢谢。

python django memcached
6个回答
66
投票

将代码放在

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,你可以编写一个shell别名来做到这一点:

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 只会导入一次,所以一般来说我会避免这种情况。如果信号框架可以在每次启动应用程序时在加载此类内容的设置后触发一个事件,那就太好了。


15
投票

Django Extensions 让您可以通过

擦除缓存
manage.py clear_cache

更多信息和许多更多命令在他们的文档中。


3
投票

您通常不想在代码发生变化而需要新缓存时使缓存失效。不是在每次重新启动时。

最好使用 Django 功能来处理:

settings.CACHES['VERSION']
[1],并在每次更改更改缓存数据格式的代码时增加该数字。 这样,在部署时,您在部署新代码时将自动使用新的缓存,但如果您的代码与以前的代码缓存兼容,则保留缓存。

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


1
投票

这个怎么样?在

settings.py
中定义一个布尔值,例如
CLEAR_CACHE_ON_RESTART = True
,然后检查其他地方是否为
True
。如果是,则清除缓存并将其设置为
False
。这段代码可以放在任何视图中(比如主视图),甚至可能放在
manage.py
urls.py
中(尽管我没有检查这一点,而且看起来不太好)。尝试一下!


0
投票

如果您有多个缓存后端,

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
投票

您可以使用自定义命令清除缓存(删除所有缓存值)。 *我使用LocMemCache:

例如,在

clearcache.py
中创建
core/management/commands/
,如下所示。 *不要忘记将
__init__.py
放入
management
commands
文件夹,并且 文档 解释了如何在 Django 中创建自定义命令:

django-project
 |-core
 |  |-settings.py
 |  └-management
 |     |-__init__.py
 |     └-commands
 |        |-__init__.py
 |        └-clearcache.py # Here
 |-my_app1
 └-my_app2

因为你把

clearcache.py
放在
core
所在的
settings.py
文件夹中,所以你需要将
'core'
设置为 INSTALLED_APPS 否则 Django 无法识别自定义命令:

# "core/settings.py"

INSTALLED_APPS = [
    ...
    'core', # Here
    ...
]

然后,在

Command
中创建扩展 BaseCommand 类的
core/management/commands/clearcache.py
类,如下所示:

# "core/management/commands/clearcache.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('Cache is cleared\n')

最后,运行以下命令可以清除缓存:

$ python manage.py clearcache
Cache is cleared
© www.soinside.com 2019 - 2024. All rights reserved.