【问题标题】:django-pipeline wipes out my entries in Django Database Cachedjango-pipeline 清除了我在 Django 数据库缓存中的条目
【发布时间】:2016-04-21 01:26:51
【问题描述】:

我正在开发一个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 的 Database Cache (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',
    }
}

【问题讨论】:

    标签: python django django-database django-cache django-pipeline


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多