使用cache.get_or_set()缓存Django函数调用的结果

时间:2016-11-23 19:37:41

标签: django caching

此条款可以正常使用:

if cache.get(cache_name):
    events = cache.get(cache_name)
else:
    events = self.get_google_events()
    cache.set(cache_name, events, 60 * 10)

如果我在get_google_events()中放置一个print语句,只有在缓存过期时才会打印出来,如预期的那样。但如果我试图将上述内容简化为:

events = cache.get_or_set(cache_name, self.get_google_events(), 60 * 10)

每次都会触发print语句(即缓存中的缓存)。第二种形式不是第一种形式吗?

2 个答案:

答案 0 :(得分:7)

不,一点也不。在调用函数本身之前,Python必须完全计算构成函数参数一部分的表达式。在第二种情况下,这意味着在self.get_google_events()可以确定是否从缓存中检索值之前,get_or_set总是被调用。

另请注意,您的第一个案例可以稍微提高效率:您现在拥有它的方式,您不必要地拨打get两次。相反,只需制作一个:

events = cache.get(cache_name)
if not events:
    events = self.get_google_events()
    cache.set(cache_name, events, 60 * 10)

答案 1 :(得分:0)

解决方案是不调用函数(没有 () )。 在你的情况下是:

events = cache.get_or_set(cache_name, self.get_google_events, 60 * 10)

您可以使用 django 文档中的示例进行测试

import datetime
from django.core.cache import cache

cache.get_or_set('some-timestamp-key', datetime.datetime.now)

>> datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)

您通常使用 datetime.datetime.now()

调用它

查看文档 Django’s cache framework