当前位置: 首页 > 面试题库 >

使Django中的视图缓存过期?

邹浩
2023-03-14
问题内容

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

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

@cache_page( 60 * 15, "blog" );
def blog( request ) ...

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


问题答案:

此解决方案适用于1.7之前的Django版本

这是我写的一种解决方案,用于执行你在自己的一些项目中正在谈论的事情:

def expire_view_cache(view_name, args=[], namespace=None, key_prefix=None):
    """
    This function allows you to invalidate any view-level cache. 
        view_name: view function you wish to invalidate or it's named url pattern
        args: any arguments passed to the view function
        namepace: optioal, if an application namespace is needed
        key prefix: for the @cache_page decorator for the function (if any)
    """
    from django.core.urlresolvers import reverse
    from django.http import HttpRequest
    from django.utils.cache import get_cache_key
    from django.core.cache import cache
    # create a fake request object
    request = HttpRequest()
    # Loookup the request path:
    if namespace:
        view_name = namespace + ":" + view_name
    request.path = reverse(view_name, args=args)
    # get cache key, expire if the cached item exists:
    key = get_cache_key(request, key_prefix=key_prefix)
    if key:
        if cache.get(key):
            # Delete the cache entry.  
            #
            # Note that there is a possible race condition here, as another 
            # process / thread may have refreshed the cache between
            # the call to cache.get() above, and the cache.set(key, None) 
            # below.  This may lead to unexpected performance problems under 
            # severe load.
            cache.set(key, None, 0)
        return True
    return False

Django会为视图请求的这些缓存设置密钥,因此该操作是为缓存的视图创建一个伪造的请求对象,并使用该对象来获取缓存密钥,然后使其过期。

要以你正在谈论的方式使用它,请尝试以下操作:

from django.db.models.signals import post_save
from blog.models import Entry

def invalidate_blog_index(sender, **kwargs):
    expire_view_cache("blog")

post_save.connect(invalidate_portfolio_index, sender=Entry)

因此,基本上,只要保存了Blog Entry对象,就会调用invalidate_blog_index,并且缓存的视图也会过期。注意:尚未对此进行广泛测试,但到目前为止对我来说还不错。



 类似资料:
  • 我很抱歉,如果这已经涵盖,但我做了广泛的搜索,没有找到答案。 首先,我使用刀片。当我在本地更新视图时,页面会正确更新和显示。但是,当我将文件上传到我的托管服务器时,我看不到这些更改。我已经等了24小时了,什么都没有。 起初我以为是我的提供者从服务器缓存,但我禁用了该功能。。当我从服务器上的app/storage/framework/views中删除文件时,新视图将正确显示。所以,这显然是一个拉威尔

  • 主要内容:在数据库设置缓存,在文件系统设置高速缓存,设置缓存在内存中,缓存整个网站,缓存视图,缓存模板片段若要缓存一些昂贵的计算结果, 下一次你需要它时不需要再执行它。以下是解释缓存如何工作的伪代码− Django提供了自己的缓存系统,可以让您保存动态网页,为了避免在需要时重新计算它们。Django缓存架构的优点是,让你缓存 - 特定视图的输出 模板的一部分 整个网站 要使用在Django中使用高速缓存,首先要做的是设置在那里的缓存会保存下来。高速缓存框架提供了不同的可能性 - 高速缓存可以被保

  • 问题内容: Django视图指向一个函数,如果您只想更改一些功能,则可能会出现问题。是的,函数中可以有数百万个关键字参数,如果有语句,甚至可以更多,但是我在想更多的面向对象方法。 例如,我有一个显示用户的页面。该页面与显示组的页面非常相似,但仍与仅使用另一个数据模型不太相似。小组也有成员等… 一种方法是将视图指向类方法,然后扩展该类。有没有人尝试过这种方法或有其他想法? 问题答案: 我已经创建并使

  • 几周前,我在Laravel5.1中遇到了同样的问题,我可以用这个解决方案解决这个问题。 然而,现在我在Lumen中面临着同样的问题,但是我不能调用来清除缓存的文件。还有别的办法吗? 谢谢!

  • 问题内容: 我正在使用Cordova和AngularJS制作一个移动应用程序。目前,我已经安装了ui-router进行路由,但是我愿意接受其他任何路由选择。 我的愿望:我想缓存某些绑定了参数的视图。换句话说,我想缓存路径(或页面)。 情况示例:假设我们看到某个仪表板页面,单击某些书的封面,该书的封面会重定向到path 。该路径是第一次加载到应用程序中。路由器从重定向到(无论名称如何)。现在,加载给

  • 我注意到Laravel缓存视图存储在但是没有清除视图缓存。因此,我必须手动删除上述文件夹中的文件。 另外,如何禁用视图缓存?