【问题标题】:Caching a semi-dynamic view in Django在 Django 中缓存半动态视图
【发布时间】:2012-04-21 20:53:19
【问题描述】:

我在 Django 中有一个“半动态”视图。就我而言,它为首次访问者和回访者提供不同的内容。我知道我的视图可以在呈现响应之前运行各种逻辑,但这会使视图(及其他)级别的缓存变得不可能,因为不同类型的用户(根据 cookie、会话数据或用户数据)将获得不同的反应。

我正在考虑几个选项来实现这一点:

  • 从我的视图重定向到另一个缓存的视图。我不喜欢这种方法,因为它会影响用户体验(更改 URL)。我知道,如果我想在 HTTP 服务器级别进行缓存,我需要选择这种方法。
  • 使用缓存标签在模板级别缓存(实际上可以缓存整个模板,从头到脚)。这样,我仍然可以为每种情况使用不同的模板。我想这是一个不错的方法,它仍然涉及运行模板引擎,这是我宁愿避免的。
  • 直接使用缓存框架在视图中缓存准备好的 HttpResponse 对象。实际上,这听起来会提供最佳性能,但感觉有点像“重新发明轮子”。

还有其他想法吗?有什么标准的方式来做我所缺少的吗?

【问题讨论】:

    标签: django caching django-templates django-views


    【解决方案1】:

    在处理动态响应时,最好使用缓存模板标签。每当您对登录用户、会话存储等内容进行更改时,您根本无法缓存整个响应。使用缓存模板标签缓存模板中不变的位是下一个最好的事情。然后,至少,只需要处理实际的动态部分。

    【讨论】:

    • 当然不能缓存模板的动态部分。就我而言,我只有两个选择,所以它不是完全动态的。如果我可以完全缓存它们中的每一个,就像一个完整的视图缓存一样,我会感觉更好。
    • 您可以使用缓存 API inside 您的视图来缓存查询集等,您可以使用缓存模板标签来缓存 HTML 的一部分,但是当您缓存整个视图(使用装饰器之一),响应本身被缓存,其中包括完整的 HTML 文档。因此,如果页面的任何部分需要更改,视图缓存就会失效(除非它取决于您可以更改的内容,例如身份验证)。
    • 也许我的问题不清楚。例如,您可以使用几周前 AWS CloudFront 引入的动态内容缓存。 aws.typepad.com/aws/2012/05/…
    • 我不确定我是否理解。所有 AWS 动态内容缓存允许使用查询字符串来区分资源。默认情况下,Django 已经这样做了。它基于 URL 和查询字符串构建缓存键,因此如果查询字符串不同,则不会使用缓存。但是,这对您几乎没有帮助,因为它只会使您陷入不断使缓存无效的情况,因此您最好不要缓存。
    • 我只是以 AWS 为例。如果我能以某种方式添加到该缓存键,那将完全解决我的问题。或许可以在视图中添加一个“get_cache_key”方法来获取所有视图参数,并且可以在必要时实现。
    【解决方案2】:

    或者,您可以缓存页面并改变页面的动态位。这可以使用two-phased-rendering 来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2012-04-24
      • 2012-03-10
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多