django缓存条件视图处理latest_entry

时间:2012-02-09 16:20:38

标签: django caching

我有一个名为aps的模型

class aps(model.Model):
    u=models.ForeignKey(User, related_name='u')
    when=models.DateTimeField() #datetime when row was inserted
    a=models.ForeignKey(User, related_name='a')
    a_read=models.BooleanField()
    a_last_read=models.DateTimeField()

aps的记录检索如下:

def displayAps(request, name)
    apz=aps.objects.order_by('-when').filter(u=User.objects.get(username=name))
    return render_to_response(template.html, {'apz':apz})

此外,它们显示在template.html中......

我想要实现的是django docz提到的here about conditional view processing

我做的事情如下:

def latest_entry(request, name):
    return aps.objects.filter().latest('when').when

@cache_page(60*15)    
@last_modified(latest_entry)
def displayAps(request, name)
    apz=aps.objects.order_by('-when').filter(u=User.objects.get(username=name))
    return render_to_response(template.html, {'apz':apz})

如果添加了新行,则不会修改内容,而是从缓存中检索内容。我需要删除缓存文件并“移动刷新”浏览器以查看新行。

任何人都能看到我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

如果您取出cache_page装饰器,它是否有效?

cache_page装饰器是在视图函数中实际调用的第一段代码。它正在检查时间戳,并按预期返回缓存的数据。如果缓存未过期,则不会调用last_modified装饰器。


无论如何,您可能希望更加谨慎地混合条件响应处理和静态缓存。他们完成类似的事情,但使用非常不同的机制。

cache_page告诉django仅使用视图每 n 秒呈现实际响应。如果在此之前有另一个请求进入,则相同的呈现内容将返回给客户端 - 无论它是否实际陈旧。这样可以减少服务器负载,但不会降低带宽。

last_modified处理客户端表示“我有这个旧版本的版本的情况;它还不错吗?”在这种情况下,您的服务器可以检查数据库,如果数据库没有更改,则返回非常短的“它仍然很好”响应。这对于这些情况显着降低了带宽需求,但您仍需要访问数据库以确定客户端的缓存是否过时,因此您的服务器负载可能几乎相同。

就像我上面提到的,你不能只在last_modfied之前应用cache_page - 如果数据库已经改变,cache_page将不知道它。更糟糕的是,如果缓存超时已过期,但数据库尚未更改,那么您最终可能会缓存“304 Not modified”消息,并为所有人发送 接下来的访客将在接下来的十五分钟内完成。

您可以按其他顺序应用装饰器,但是您必须从数据库为每个请求发出请求,并且您仍然可能进入数据库已更改但缓存未过期的情况 - 在这种情况下,客户端仍然可以获取旧版本的页面,即使服务器已经命中数据库以确定它已被更新。

答案 1 :(得分:0)

过滤器取决于某些已登录的用户或某些内容,您应该在cookie中识别此用户并使用django的vary_on_cookie。