Django 缓存

缓存某些数据是为了减少复杂的计算的过程,以便下次需要这些数据时不会重新再执行它。以下是解释缓存如何工作的伪代码。

given a URL, try finding that page in the cache

if the page is in the cache:
   return the cached page
else:
   generate the page
   save the generated page in the cache (for next time)
   return the generated page

Django 带有自己的缓存系统,可让保存动态页面,以避免在需要时再次重新执行。Django Cache 框架的优点是你可以缓存以下数据

  • 特定视图的输出。
  • 模板的一部分。
  • 您的整个网站。

要在 Django 中使用缓存,首先要做的是设置缓存的位置。缓存框架提供了不同的选择项——缓存可以保存在数据库、文件系统或直接保存在内存中。设置在项目的settings.py文件中完成。


在数据库中设置缓存

只需在项目 settings.py 文件中添加以下内容 -

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
      'LOCATION': 'my_table_name',
   }
}

为了使其工作并完成设置,我们需要创建缓存表“cache_table”。为此,需要执行以下操作

$ python3 manage.py createcachetable

在文件系统中设置缓存

如果想将缓存保存在文件系统中,只需在项目 settings.py 文件中添加以下内容 -

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
      'LOCATION': '/var/tmp/django_cache',
   }
}

在内存中设置缓存

这是最有效的缓存方式,我们可以使用以下选项之一,具体取决于为内存缓存选择的 Python 扩展库

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': '127.0.0.1:11211',
   }
}

或者

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': 'unix:/tmp/memcached.sock',
   }
}

在上面看到的,我们使用的memcached。当然我们也可以选择其他的内存缓存系统,如: redis。


缓存整个站点

在 Django 中使用缓存的最简单方法是缓存整个站点。这是通过编辑项目 settings.py 中的 MIDDLEWARE 配置项来完成的。以下需要添加到配置项中

MIDDLEWARE = [
   'django.middleware.cache.UpdateCacheMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.cache.FetchFromCacheMiddleware',
]

注意这里的顺序很重要,Update 应该在 Fetch 中间件之前。

然后在同一个文件中,您需要设置 -

CACHE_MIDDLEWARE_ALIAS – 使用缓存时在代码中的别名
CACHE_MIDDLEWARE_SECONDS – 每个页面缓存的秒数

缓存视图

如果你不想缓存整个站点,则可以缓存特定视图。这是通过使用Django 附带的cache_page装饰器来完成的。假设我们要缓存 articles 视图的结果

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)

def articles(request, month, year):
    text = "<h1>欢迎访问迹忆客 !</h1><p>获取 %s/%s 的文章</p>" % (year, month)
    return HttpResponse(text)

如上所见,cache_page 将视图结果缓存起来,其参数是指定缓存时间。在我们上面的例子中,结果将被缓存 15 分钟。

注意- 正如我们之前看到的,上面的视图对应的路由如下

urlpatterns = [
    re_path(r'articles/(?P<month>\d{2})/(?P<year>\d{4})', views.articles),
]

由于 URL 正在接受参数,因此每个不同的调用都会被单独缓存。例如,对 /myapp/articles/02/2007 和 /myapp/articles/03/2008 的请求将单独缓存。

缓存视图也可以直接在 urls.py 文件中完成。那么下面的结果和上面一样。只需编辑您的 app/urls.py 文件并将相关的映射 URL(以上)更改为

urlpatterns = [
    re_path(r'articles/(?P<month>\d{2})/(?P<year>\d{4})', cache_page(60 * 15)('articles'), name = 'articles'),
]

而且,当然,在 app/views.py 中不再需要它。


缓存模板片段

我们还可以缓存模板的一部分,这是通过使用缓存标记来完成的。让我们以template.html模板为例-

{% extends "main_template.html" %}
{% block title %}Django 继承主模板 - 迹忆客{% endblock %}
{% block content %}
<h2>欢迎访问 {{webname}} ! </h2>
<h3>迹忆客网址:{{website|upper}}</h3>
<p>今天是 {{today.month}}月{{today.day}}号</p>
<p>
    {% if today.day == 1 %}
    今天是本月的第一天
    {% elif today.day == 30 %}
    今天是本月的最后一天
    {% else %}
    今天学习 Django
    {% endif %}
</p>
<p>
    {% for day in days_of_week %}
    {{day}}
    {% endfor %}
</p>
{% endblock %}

为了缓存内容块,我们的模板将变成如下

{% load cache %}
{% extends "main_template.html" %}
{% block title %}Django 继承主模板 - 迹忆客{% endblock %}
{% cache 500 content %}
{% block content %}
<h2>欢迎访问 {{webname}} ! </h2>
<h3>迹忆客网址:{{website|upper}}</h3>
<p>今天是 {{today.month}}月{{today.day}}号</p>
<p>
    {% if today.day == 1 %}
    今天是本月的第一天
    {% elif today.day == 30 %}
    今天是本月的最后一天
    {% else %}
    今天学习 Django
    {% endif %}
</p>
<p>
    {% for day in days_of_week %}
    {{day}}
    {% endfor %}
</p>
{% endblock %}
{% endcache %}

正如在上面看到的,缓存标签将采用 2 个参数 - 您希望块被缓存的时间(以秒为单位)和为缓存片段提供的名称。

查看笔记

扫码一下
查看教程更方便