📜  Django-缓存

📅  最后修改于: 2020-10-25 10:04:48             🧑  作者: Mango


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

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

请注意,这里的顺序很重要,更新应该先于获取中间件。

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

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\d{2})/(?P\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\d{2})/(?P\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!!!

Today is {{today}}

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%}

{% for day in days_of_week %} {{day}}

{% endfor %} {% endblock %}

为了缓存内容块,我们的模板将变为-

{% load cache %}
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% cache 500 content %}
{% block content %}

Hello World!!!

Today is {{today}}

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%}

{% for day in days_of_week %} {{day}}

{% endfor %} {% endblock %} {% endcache %}

如您在上面看到的,缓存标记将采用2个参数-您希望缓存该块的时间(以秒为单位)以及要赋予该缓存片段的名称。