在Django中缓存半动态视图

在Django中缓存半动态视图,django,caching,django-templates,django-views,Django,Caching,Django Templates,Django Views,我在Django有一个“半动态”的观点。在我的例子中,它为初次访问和返回的访问者提供不同的内容。我知道我的视图可以在呈现响应之前运行各种逻辑,但这会使视图(及更高级别)中的缓存变得不可能,因为不同类型的用户(根据cookie、会话数据或用户数据)将获得不同的响应 我正在考虑几个选项来实现这一点: 从我的视图重定向到另一个缓存的视图。我不喜欢这种方法,因为它会影响用户体验(更改URL)。我知道如果我想在HTTP服务器级别缓存,我需要选择这种方法 使用Cache标记在模板级别进行缓存(实际上可以从

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

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

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

还有其他想法吗?有什么我没有的标准方法吗

处理动态响应时,使用缓存模板标记是最佳选择。任何时候,当您在登录用户、会话存储等方面发生变化时,您都无法缓存整个响应。使用cache-template标记缓存模板的非更改位是次好的选择。然后,至少只需要处理实际的动态部分。

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

当然,模板的动态部分不能缓存。在我的例子中,我只有两个选择,所以它不是完全动态的。如果我可以像完整的视图缓存一样完全缓存它们,我会感觉更好。您可以在视图中使用缓存API来缓存查询集等,也可以使用缓存模板标记来缓存HTML的一部分,但是当您缓存整个视图(使用一个装饰器)时,响应本身会被缓存,其中包括完整格式的HTML文档。因此,如果页面的任何部分需要更改,视图缓存将退出(除非它取决于您可以更改的内容,例如身份验证)。也许我的问题不清楚。以AWS CloudFront几周前推出的动态内容缓存为例。我不太明白。AWS动态内容缓存允许使用查询字符串来区分资源。Django在默认情况下已经做到了这一点。它基于URL和查询字符串构建缓存键,因此如果查询字符串不同,它将不使用缓存。然而,这几乎帮不上什么忙,因为这会让你陷入不断使缓存失效的境地,所以你最好不要缓存。我只是以AWS为例。如果我能以某种方式添加到缓存密钥,这将完全解决我的问题。可能会向视图添加一个“get_cache_key”方法,该方法获取所有视图参数,必要时可以实现。