Django-Pipeline стирает мои записи в кеше базы данных Django.

Я работаю над 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/) для кэширования некоторых длительных результатов статистических вычислений.

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

Я казнил createcachetable и таблица была создана. Я помещаю записи в эту таблицу без даты истечения срока действия, так как у меня есть своя собственная проверка достоверности, и я могу сам решить, являются ли данные актуальными или их необходимо пересчитать.

К моему удивлению, однако, когда я выпускаю collectstatic за pipeline, он стирает содержимое этой таблицы и заполняет его собственным 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',
    }
}

1 ответ

Решение

Определение отдельного кэша для статических файлов решит проблему. 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',
}
Другие вопросы по тегам