【问题标题】:best place to clear cache when restarting django server重新启动 django 服务器时清除缓存的最佳位置
【发布时间】:2011-08-22 00:21:19
【问题描述】:

我希望在 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


    【解决方案1】:

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

    【讨论】:

    • 当我在外部 HUP 服务器时不起作用,无论我如何重新启动/重新加载服务器,我都希望它调用清除缓存。我在生产中使用runit 来启动/停止cherrypy。在这种情况下,您的建议将不起作用。我希望该解决方案可用于不同的设置。
    • 我不知道runit是什么,但是你可以随时使用管理命令。
    • 我假设你有某种初始化脚本?只需添加对 clearcache 的调用即可。
    • 它只是杀死并重新启动 django 服务器。我同意你的看法,但我想让清除缓存独立于系统设置。因为我不是唯一的开发人员,并且存在 >1 个设置(生产、开发和测试)。都有不同的管理和 django 服务调用。
    • @Motiejus - 如果您的脚本只是“杀死并重新启动服务器”,请在下面添加一行调用管理命令。这是做你想做的事情的“正确”方法。其他方法将代码放在不属于它的地方(例如@freakish 的方法),从长远来看,这比要求您的开发人员运行脚本来重新启动服务器要糟糕得多。
    【解决方案2】:

    Django Extensions 允许您通过

    擦除缓存
    manage.py clear_cache
    

    更多信息和许多更多命令在他们的docs

    【讨论】:

      【解决方案3】:

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

      最好使用 Django 功能来处理:settings.CACHES.VERSION,并且在每次更改更改缓存数据格式的代码时增加该数字。 这样,在部署时,您会在部署新代码时自动使用新缓存,但如果您的代码与之前的代码缓存兼容,则保留缓存。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 很想把提到的代码放到somewhere,它是在加载时加载的(任何应用程序的urls.py、views.py、models.py)。但是,我想确保它在每个运行时只加载一次。不是每个线程或每个请求一次。因此,您的建议是不可接受的。
        • 为什么不呢?正如我所说,您需要检查布尔全局常量(在设置中定义)并在第一次检查后将其设置为 false。所有其他检查都不会做任何事情。另请注意,(我认为)urls.py 仅在服务器重新启动后加载一次(尽管我没有检查这一点)。尽管如此,这不是正确的做事方式。要做到这一点,您确实应该编写一些外部脚本。
        • 所以每次他想重新加载/重新启动服务器时,他们都必须在 False 到 True 之间切换?
        【解决方案5】:

        如果您有多个缓存后端,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))
        

        【讨论】:

          猜你喜欢
          • 2011-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          相关资源
          最近更新 更多