有没有办法在Django中忽略缓存错误?

niwlg2el  于 2023-03-31  发布在  Go
关注(0)|答案(4)|浏览(159)

我刚刚将我们的Django开发站点设置为使用redis作为缓存后端,一切正常。我关闭了redis来看看会发生什么,果然Django 404是由于缓存后端的行为。要么是连接被拒绝,要么是其他各种错误。
有没有什么方法可以让Django忽略缓存错误,并继续正常处理?缓存是一种性能优化,但如果失败,可能会导致整个站点崩溃,这似乎很奇怪。
我试着在后端写一个 Package 器,如下所示:

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://')

但这行不通,因为我试图在设置缓存类型的调用中设置该高速缓存类型。
那么,有没有简单的方法来吞下缓存错误?或者设置默认的缓存后端失败?

mftmpeh8

mftmpeh81#

查看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',
    }
}
pengsaosao

pengsaosao2#

看起来没有什么好的方法来做我想做的事情,而不直接将错误处理写入该高速缓存后端支持的方法中。即使后端的init失败,一些后端也只会在第一次访问后端时抛出错误。
我所做的是修改了后端,以 Package 所有的错误处理方法,该错误处理是以传递给构造函数的参数为条件的。没有我想要的那么好..但它是最少侵入的。
调用代码中不需要任何更改,因此接口(如果您愿意的话)将得到维护。

rbpvctlc

rbpvctlc3#

我没有使用过它,但这里有一个Django片段,声称提供了一个具有回退功能的缓存后端:http://djangosnippets.org/snippets/2193/

2wnc66cl

2wnc66cl4#

创建CustomCache

from django.core.cache import caches
from django.core.cache.backends.base import BaseCache
from django.utils.connection import ConnectionProxy
Default_Timeout = 1200  # in seconds

class CustomCache(BaseCache):
    def __init__(self):
        try:
            self.cache = ConnectionProxy(caches, DEFAULT_CACHE_ALIAS)
        except Exception as e:
            self.cache = None
    def get(self, key, default=None):
        try:
            return self.cache.get(key)
        except Exception as exc:
            return default
    def set(self, key, value, timeout=Default_Timeout):
        try:
            return self.cache.set(key, value, timeout)
        except Exception as exc:
            return False
    def get_or_set(self, key, callable_func, timeout=Default_Timeout):
        try:
            return self.cache.get_or_set(key, callable_func, timeout)
        except Exception as exc:
            return callable_func()

custom_cache = CustomCache()

类似地实现其它方法,如has_key()、delete()、clear()、all_keys()等。
现在到处都导入这个custom_cache而不是django.core.cache

相关问题