Есть ли способ игнорировать ошибки кэша в Django? - PullRequest
7 голосов
/ 23 декабря 2010

Я только что настроил наш сайт Django для разработки, чтобы он использовал redis для бэкенда кеша, и все работало нормально. Я выключил Redis, чтобы посмотреть, что произойдет, и, конечно же, Django 404 из-за поведения бэкэнда кэша. Либо в соединении было отказано, либо произошли другие ошибки.

Есть ли способ проинструктировать Django игнорировать ошибки кэша и продолжить обработку обычным способом? Кажется странным, что кэширование - это оптимизация производительности, но может привести к поломке всего сайта в случае сбоя.

Я попытался написать обертку вокруг бэкэнда так:

class CacheClass(redis_backend.CacheClass):
    """ Wraps the desired Cache, and falls back to global_settings default on init failure """
    def __init__(self, server, params):
        try:
            super(CacheClass, self).__init__(server, params)
        except Exception:
            from django.core import cache as _
            _.cache = _.get_cache('locmem://')

Но это не сработает, так как я пытаюсь установить тип кэша в вызове, который устанавливает тип кэша. Это все очень большой беспорядок.

Итак, есть ли простой способ проглотить ошибки кеша? Или установить бэкэнд по умолчанию для кэша при сбое?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2017

Посмотрите на django-cache-fallback :

https://pypi.python.org/pypi/django-cache-fallback/0.2.1

CACHES = {
    # Set default cache to FallbackCache
    'default': {
        'BACKEND': 'cache_fallback.FallbackCache',
    },
    # Your production main cache (Redis, for example)
    'main_cache': {
        'BACKEND': 'redis_lock.django_cache.RedisCache',
        'LOCATION': redis_url,
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        },
        'TIMEOUT': 500,
    },
    # Use dummy cache to ignore main cache errors and get data from DB
    'fallback_cache': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}
0 голосов
/ 02 января 2011

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

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

Ничего не нужно менять в вызывающем коде, поэтому интерфейс, если хотите, поддерживается.

0 голосов
/ 02 января 2011

Я не использовал его, но вот фрагмент кода Django, который утверждает, что предоставляет кеш-бэкэнд с функцией отката: http://djangosnippets.org/snippets/2193/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...