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

为了这个工作并完成设置,我们需要创建缓存表'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',
   }
}

要么

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

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

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

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分钟。

- 正如我们之前所见,上面的视图被映射到 -

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中不再需要。

缓存模板片段

您也可以缓存模板的一部分,这是通过使用 缓存 标记完成的。让我们来看看我们的 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个参数 - 您希望缓存块的时间(以秒为单位)以及要给缓存碎片的名称。