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 应该在 Fetch 中间件之前。
    然后在同一个文件中,您需要设置 -
    
    CACHE_MIDDLEWARE_ALIAS – 用于存储的缓存别名。
    CACHE_MIDDLEWARE_SECONDS – 每个页面应该被缓存的秒数。
    
  • 缓存视图

    如果您不想缓存整个站点,您可以缓存特定视图。这是通过使用cache_pageDjango 自带的装饰器。假设我们要缓存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 个参数 - 您希望缓存块的时间(以秒为单位)和缓存片段的名称。