我有一个名为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})
如果添加了新行,则不会修改内容,而是从缓存中检索内容。我需要删除缓存文件并“移动刷新”浏览器以查看新行。
任何人都能看到我在这里做错了什么?
答案 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。