首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django缓存条件视图处理latest_entry

django缓存条件视图处理latest_entry
EN

Stack Overflow用户
提问于 2012-02-10 00:20:38
回答 2查看 560关注 0票数 0

我有一个叫aps的模型

代码语言:javascript
复制
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中检索记录的方式如下:

代码语言:javascript
复制
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

我做了一些类似的事情:

代码语言:javascript
复制
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刷新”浏览器才能看到新的行。

有没有人看到我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 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分钟内向所有后续访问者发送该消息。

您可以按其他顺序应用装饰器,但是您必须为每个请求从数据库发出一个请求,而且您仍然可能遇到这样的情况:数据库已经更改,但是缓存没有过期--在这种情况下,即使服务器已经访问数据库以确定它已经更新,客户机仍然可以获取旧版本的页面。

票数 2
EN

Stack Overflow用户

发布于 2015-04-02 04:09:36

过滤器依赖于一些登录的用户或其他东西,你应该在cookie中标识这个用户,并使用django的vary_on_cookie。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9214636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档