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

时间:2011-05-09 21:35:13

标签: python django memcached

我想在每次重启/重装django服务器时刷新memcached。我使用cherrypy进行生产和内置服务器进行开发。

我会在CACHES之后将它添加到settings.py:

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

还有其他建议吗?感谢。

5 个答案:

答案 0 :(得分:54)

将代码置于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'

或者我认为你可以把它写成一个独立的脚本和configure the settings it requires by hand

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只会导入一次,所以一般情况下我都会避免这种情况。如果信号框架可以在每次启动应用程序时触发一次事件,在为这样的内容加载设置之后,这将是很好的。

答案 1 :(得分:5)

Django Extensions可让您通过

擦除缓存
manage.py clear_cache

更多信息以及<{3}}中许多更多命令。

答案 2 :(得分:1)

如果代码以需要新缓存的方式更改,通常不会使缓存无效。不在每次重启

最好使用Django功能处理:guard let urlW = URL(string: "https://en.wikipedia.org/wiki/\(place.name)") else { return } let svc = SFSafariViewController.init(url: urlW) self.navigationController?.pushViewController(svc, animated: true) [1],并在每次更改更改缓存数据格式的代码时增加该数字。 这样,在部署时,您在部署新代码时会自动使用新缓存,但如果您的代码与以前的代码缓存兼容,请保留缓存。

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

答案 3 :(得分:0)

这个怎么样?在settings.py中定义一个布尔值,例如CLEAR_CACHE_ON_RESTART = True,然后在其他地方检查它是否为True。如果是,则清除缓存并将其设置为False。此代码可以放在任何视图中(如主视图),甚至可能放在manage.pyurls.py中(虽然我没有检查这个但看起来不太好)。试一试!

答案 4 :(得分:0)

如果您有多个缓存后端,则print(file_search(['/home', ['user1'], ['user2', ['my pictures'], ['desktop', 'not this', 'and not this', ['new folder', 'hereiam.py']]], 'work.ovpn', 'prometheus.7z', ['user3', ['temp'], ], 'hey.py'], 'hereiam.py')) 仅清除默认缓存。为确保您的django.core.cache.cache.clear()命令清除所有后端的缓存,您应使用以下命令:

clear_cache