目录

Django - 缓存( Caching)

缓存某些内容是为了保存昂贵计算的结果,以便下次需要时不执行它。 以下是一个伪代码,解释了缓存的工作原理 -

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',
   }
}

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

python 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',
   }
}

Or

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

缓存整个站点

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

MIDDLEWARE_CLASSES += (
   'django.middleware.cache.UpdateCacheMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.cache.FetchFromCacheMiddleware',
)

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

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

CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.

缓存视图

如果您不想缓存整个站点,则可以缓存特定视图。 这是通过使用Django附带的cache_page装饰器完成的。 让我们说我们要缓存viewArticles视图的结果 -

from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def viewArticles(request, year, month):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

如您所见, cache_page采用您希望将视图结果作为参数缓存的秒数。 在上面的示例中,结果将缓存15分钟。

Note - 正如我们之前看到的,上面的视图是映射到 -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)

由于URL是参数,因此每个不同的调用将单独缓存。 例如,对/ myapp/articles/02/2007的请求将单独缓存到/ myapp/articles/03/2008。

缓存视图也可以直接在url.py文件中完成。 然后以下具有与上述相同的结果。 只需编辑myapp/url.py文件并将相关的映射URL(上图)更改为 -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 
   cache_page(60 * 15)('viewArticles'), name = 'articles'),)

当然,myapp/views.py中不再需要它。

缓存模板片段

您还可以缓存模板的某些部分,这可以通过使用cache标记来完成。 我们来看看我们的hello.html模板 -

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
   {% for day in days_of_week %}
   {{day}}
</p>
{% endfor %}
{% endblock %}

要缓存内容块,我们的模板将成为 -

{% load cache %}
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% cache 500 content %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
   {% for day in days_of_week %}
   {{day}}
</p>
{% endfor %}
{% endblock %}
{% endcache %}

如上所示,缓存标记将采用2个参数 - 您希望缓存块的时间(以秒为单位)以及要为缓存片段指定的名称。

↑回到顶部↑
WIKI教程 @2018