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 по умолчанию будет иметь некоторые правила, которые я должен сохранить)

Вернуться на верх