Django - Отключение предупреждений о ключах кэша
В настоящее время я разрабатываю приложение Django и установил кэш базы данных, увеличил размер ключа до 500 символов, однако я постоянно получаю это предупреждение: CacheKeyWarning: Ключ кэша вызовет ошибки при использовании с memcached: key_text (длиннее 250)
Прочитал документацию здесь: https://docs.djangoproject.com/en/3.2/topics/cache/
Если вы используете производственный бэкенд, который может принимать более широкий диапазон ключей (пользовательский бэкенд или один из встроенных бэкендов без memcached), и хотите использовать этот широкий диапазон без предупреждений, вы можете заглушить CacheKeyWarning с помощью этого кода в модуле управления одного из ваших INSTALLED_APPS.
Я создал папку management в своем приложении (пробовал в разных местах) и добавил в нее требуемый код в виде management.py, но он не работает. Удалось ли кому-нибудь заглушить эти предупреждения и может ли он поделиться тем, куда его добавил? Спасибо
Вот TLDR-ответ, использующий бэкенд RedisCache
(все остальные бэкенды должны работать одинаково). Обновите имена папок/проектов по мере необходимости:
В your_project_folder/YOUR_PROJECT/cache.py
:
from django.core.cache.backends.redis import RedisCache
class RedisCache(RedisCache):
def validate_key(self, key):
"""
Custom validation, raising exceptions or warnings as needed.
"""
pass
В settings.py
:
CACHES = {
'default': {
'BACKEND': 'YOUR_PROJECT.cache.RedisCache', # use our "new" cache backend
'LOCATION': 'redis://127.0.0.1:6379/0', # example location (use your existing settings)
}
}
Немного более длинный ответ:
Django изначально поддерживает множество бэкендов кэша (RedisCache
, LocMemCache
и т.д.). Каждый бэкенд расширяет класс django.core.cache.backends.BaseCache
, который проверяет ключи удобным для memcache способом, чтобы обеспечить "переносимость кода":
def validate_key(self, key):
"""
Warn about keys that would not be portable to the memcached
backend. This encourages (but does not force) writing backend-portable
cache code.
"""
for warning in memcache_key_warnings(key):
warnings.warn(warning, CacheKeyWarning)
Поскольку другие бэкенды не переопределяют эту функциональность, мы должны переопределить ее сами с помощью пустого метода, показанного в первом блоке кода в начале этого ответа.
Примечание: Обход этих предупреждений не позволит вашим ключам работать в memcached. Лично для меня это не проблема, но разработчики Django явно подталкивают разработчиков к коду, который работает для всех бэкендов кэша.
Все это объясняется в Django docs, но в документации нет явного упоминания о том, что можно передавать пустой метод validate_key
. (Прежде чем искать, я ошибочно предположил, что реализация Redis по умолчанию будет иметь некоторые правила, которые я должен сохранить)