我有一个叫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})如果添加了新行,则不会修改内容,而是从缓存中检索内容。我需要删除缓存文件并“shift刷新”浏览器才能看到新的行。
有没有人看到我做错了什么?
发布于 2012-02-10 02:29:27
如果去掉cache_page装饰器,它能工作吗?
cache_page装饰器是视图函数中实际调用的第一段代码。它正在检查时间戳,并返回缓存的数据,这是它应该做的。如果缓存没有过期,则永远不会调用last_modified装饰器。
无论如何,您可能希望更加小心地混合条件响应处理和静态缓存。他们完成了相似的事情,但使用了非常不同的机制。
cache_page告诉django仅使用视图每隔n秒呈现一次实际响应。如果在此之前出现另一个请求,则相同的呈现内容将返回给客户端--无论它是否实际已过时。这会减少服务器负载,但不会减少带宽。
last_modified处理这样的情况:客户端说“我有一个这个页面的版本已经这么旧了;它还好吗?”在这种情况下,您的服务器可以检查数据库,如果数据库没有更改,则返回一个非常简短的"It's good“响应。这大大减少了这些情况下的带宽需求,但您仍然需要访问数据库来确定客户端的缓存是否陈旧,因此您的服务器负载可能几乎相同。
正如我在上面提到的,不能只在last_modfied之前应用cache_page --如果数据库发生了变化,cache_page不会知道。更糟糕的是,如果缓存超时已经到期,但是数据库没有改变,那么您最终可能会缓存“304not modified”消息,并在接下来的15分钟内向所有后续访问者发送该消息。
您可以按其他顺序应用装饰器,但是您必须为每个请求从数据库发出一个请求,而且您仍然可能遇到这样的情况:数据库已经更改,但是缓存没有过期--在这种情况下,即使服务器已经访问数据库以确定它已经更新,客户机仍然可以获取旧版本的页面。
发布于 2015-04-02 04:09:36
过滤器依赖于一些登录的用户或其他东西,你应该在cookie中标识这个用户,并使用django的vary_on_cookie。
https://stackoverflow.com/questions/9214636
复制相似问题