【问题标题】:Django - how to cache template for all url prefixDjango - 如何缓存所有url前缀的模板
【发布时间】:2021-04-16 05:03:51
【问题描述】:

我有一个 Django 应用程序,它呈现 html 模板并通过 ajax 从前端(基于 url 的动态 id)将数据加载到 html 中。 例如,这是我网站的动态 url 模式“www.mysite.com/order/”,我希望 django 缓存并将所有请求返回到这个 url 前缀 r” ^**www.mysite.com/order/**" 渲染 html 而不会影响我的视图功能。

目前,url 模式 ("/order/100","/order/101","/order/102..etc") 中的每个动态 id 都会出现在我的视图中,并为每个动态 id 呈现相同的模板。

我期待,任何使用前缀“/order/”访问的 html 模板都需要自动呈现,而不会影响我的视图。我目前正在使用redislite进行缓存,请帮助我解决方案。

更新:似乎使用像 React 或 Angular JS 这样的前端框架可以解决我在 django 中的“避免 html 模板渲染”的情况。不想让django在渲染html上浪费时间,所以想到了缓存模板。

【问题讨论】:

  • 如果订单是动态的,您是否在模板中显示动态数据?如果是这样,您将无法缓存它。如果你缓存它,每个订单的内容都是一样的。
  • html 模板有一个 javascript,它将在加载时调用 ajax,并且 ajax 将填充数据。

标签: django caching redis django-views django-templates


【解决方案1】:

您可以使用cache_pagecache per-view。这可能最适合您尝试做的事情。

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)  # 15 mins
def my_view(request):
    ...

或者你可以缓存模板的片段,在这里你使用cache模板标签和一个时间(以秒为单位)来缓存标记块;

{% load cache %}

{% cache 500 sidebar %}
    .. sidebar ..
{% endcache %}

这种类型的缓存可以像上面一样简单,或者您可以通过改变登录用户来进行更复杂的缓存,例如。你可以阅读那个here上的文档

【讨论】:

  • 我的 url conf 就像 path('order/<id>/', views.orders) 和我的视图函数就像 @cache_page(60 * 15) def orders(request,id): return render(request, page.html).. 是只缓存一次还是为每个新 id 缓存?
  • 正如您将在链接文档中看到的那样,cache_page 基于 URL 进行缓存,因此每个 ID 都是独立的。
猜你喜欢
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2015-05-25
  • 1970-01-01
  • 2016-05-29
  • 2021-03-19
  • 2017-10-25
相关资源
最近更新 更多