gpt4 book ai didi

python - 如何禁用 Django 内部函数缓存?

转载 作者:可可西里 更新时间:2023-11-01 11:12:15 24 4
gpt4 key购买 nike

我正在制作一些使用 Redis 作为后端缓存的 Django 项目[1],但我不能确定 Redis 服务器是否会一直运行,然后我尝试“如果”Redis 可用否则使用其他一些后端,如 LocMem 等。

我使用的 Redis 后端 [1] 是完全兼容的,因此我可以使用 Django Decorations。

我想创建一个这样调用的函数:

from django.views.decorators.cache import cache_page
from utils import PingBackend
from time import time

@cache_page(60, cache=PingBackend(time()))
def index(request):

artigos = Artigo.objects.filter(ativo=1)

return render_to_response('index.html', {'artigos':artigos}, RequestContext(request))

问题是 Django(我猜是内部)缓存 PingBackend() 的响应并仅在第一次调用它,即使我删除了 RedisServer Django 告诉 ping 过程成功。

即使在 DEBUG=True 和“默认”CacheBackend 为虚拟的情况下也会发生。

def PingBackend(time):
print time

response = None

try:
con = StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0)

# Execute some action
con.ping()

# If not give an exception, use redis
response = 'redis'

except:
response = 'default' #dummy

return last_response

我正在传递 time() 只是为了创建一些差异化来尝试解决缓存问题。

总体情况是 PingBackend() 函数不会针对每个请求执行,只是针对第一个请求,因为我无法监控 Redis 服务器。

谢谢!

[1] - https://github.com/niwibe/django-redis

最佳答案

这不是关于 Django 的内部结构,而是关于装饰器的工作原理。当您这样定义 View 时:

@cache_page(60, cache=PingBackend(time()))
def index(request):
blah blah

它完全等同于:

def index(request):
blah blah
index = cache_page(60, cache=PingBackend(time()))(index)

您只调用了一个 cache_page,向它传递了一个 cache 参数,该参数是您通过一次调用 PingBackend 获得的。它甚至不只是针对第一个请求执行,而是在定义 View 函数时执行一次。

您应该编写自己的缓存后端,如果它可用,则使用 Redis,如果不可用,则使用其他东西。

关于python - 如何禁用 Django 内部函数缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com