Django 缓存

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缓存框架的好处是,你可以缓存:

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

在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 middleware 应该在 Fetch middleware 之前。

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

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

而且,它在我的app/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 %}

如上所示,cache标签将接受2个参数−您希望块被缓存的时间(以秒为单位)和要给缓存片段命名的名称。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程