Django管道清除Django数据库Cach中的条目

2024-09-19 23:44:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个Django应用程序,它使用django-pipeline来处理浏览器的文件缓存问题(还有其他好处)。你知道吗

STATIC_URL = '/static/'

STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'bower'),
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'pipeline.finders.PipelineFinder',
    'pipeline.finders.CachedFileFinder',
)

PIPELINE = {}
PIPELINE['DISABLE_WRAPPER'] = True
PIPELINE['JS_COMPRESSOR'] = 'pipeline.compressors.NoopCompressor'
PIPELINE['CSS_COMPRESSOR'] = 'pipeline.compressors.yuglify.YuglifyCompressor'

PIPELINE['COMPILERS'] = (
    'pipeline.compilers.sass.SASSCompiler',
    'pipeline.compilers.es6.ES6Compiler',
)

PIPELINE['JAVASCRIPT'] = {
...
}

PIPELINE['STYLESHEETS'] = {
...
}

PIPELINE['SASS_BINARY'] = 'C:\\Ruby22-x64\\bin\\sass.bat'
PIPELINE['BABEL_BINARY'] = 'c:\\Users\\Foobar\\node_modules\\.bin\\babel.cmd'

到目前为止还不错。最近我们决定使用Django的数据库缓存(https://docs.djangoproject.com/en/1.9/topics/cache/#database-caching)来缓存一些长时间运行的统计计算结果。你知道吗

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'django_dbcache',
    }
}

我执行createcachetable并创建了表。由于我有自己的有效性检查,可以自己决定数据是最新的,还是需要重新计算,所以我将条目放入这个表中,没有过期日期。你知道吗

然而,令我惊讶的是,当我为pipeline发出一个collectstatic时,它会擦除该表的内容并用它自己的staticfiles:{md5code}键值填充它。(在生产中,我看到的情况是,它并没有消灭一切)。但这使得我的缓存方案无法正常工作。在管道文档中,我似乎找不到任何关于如何停止pipeline这样做的设置。pipeline缓存中的缓存条目值非常短,只包含生成文件的完整路径。这些条目的过期时间是几个小时。我不介意他们在那里,只是不要擦我的东西。你知道吗


附加说明:我使用的是Windows平台(请参阅上面的管道设置),但在Linux生产服务器上也会发生同样的情况。你知道吗


除了有标记的答案:知道任何人都可以破坏默认的缓存+静态文件可以粗暴地将其清除,最好将我们和其他人分开:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'default-cache',
    },
    'staticfiles': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'static-files',
    },
    'my_dbcache': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'django_dbcache',
    }
}

Tags: 文件djangocorebackenddefaultcachepipelinelocation
1条回答
网友
1楼 · 发布于 2024-09-19 23:44:30

为静态文件定义一个单独的缓存可以解决这个问题。默认情况下,Django首先查找“staticfiles”缓存。 示例:

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
    'LOCATION': 'django_dbcache',
},
'staticfiles': {
    'BACKEND': "django.core.cache.backends.locmem.LocMemCache",
    'LOCATION': 'static-files',
}

相关问题 更多 >