猿问

使Django中的视图缓存过期?

该@cache_page decorator真棒。但是对于我的博客,我希望将页面保留在缓存中,直到有人发表评论。这听起来像是个好主意,因为人们很少评论,因此将页面保留在内存缓存中,而没人评论会很好。我以为有人以前一定有这个问题?这与每个URL的缓存不同。


因此,我正在考虑的解决方案是:


@cache_page( 60 * 15, "blog" );

def blog( request ) ...

然后,我将保留用于博客视图的所有缓存键的列表,然后使“博客”缓存空间过期。但是我对Django并没有超级的经验,所以我想知道是否有人知道这样做的更好方法?


守着星空守着你
浏览 679回答 3
3回答

函数式编程

我为这种情况编写了Django-groupcache(您可以在此处下载代码)。就您而言,您可以这样写:from groupcache.decorators import cache_tagged_page@cache_tagged_page("blog", 60 * 15)def blog(request):    ...从那里,您可以稍后再做:from groupcache.utils import uncache_from_tag# Uncache all view responses tagged as "blog"uncache_from_tag("blog") 还要看看cache_page_against_model():涉及的更多一些,但是它将允许您根据模型实体的更改自动取消缓存响应。

杨__羊羊

使用最新版本的Django(> = 2.0),您正在寻找的东西很容易实现:from django.utils.cache import learn_cache_keyfrom django.core.cache import cachefrom django.views.decorators.cache import cache_pagekeys = set()@cache_page( 60 * 15, "blog" );def blog( request ):    response = render(request, 'template')    keys.add(learn_cache_key(request, response)    return responsedef invalidate_cache()    cache.delete_many(keys)当有人通过pre_save信号更新博客中的帖子时,您可以将invalidate_cache注册为回调。
随时随地看视频慕课网APP
我要回答