- Django 基本概念
- Django - 首页
- Django - 基础
- Django - 概述
- Django - 环境搭建
- Django - 创建项目
- Django - 应用生命周期
- Django - 创建视图
- Django - URL 路由
- Django - 首页页面
- Django - 模板系统
- Django - MVT
- Django - 添加主模板
- Django Admin 后台管理
- Django Admin - 界面
- Django Admin - 创建用户
- Django Admin - 集成模型
- Django Admin - 设置显示字段
- Django Admin - 更新对象
- Django 模型
- Django - 模型
- Django - 插入数据
- Django - 更新数据
- Django - 删除数据
- Django - 更新模型
- Django 静态文件
- Django - 添加静态文件
- Django - 添加 CSS 文件
- Django 高级应用
- Django - 404 页面未找到
- Django - 页面重定向
- Django - 发送邮件
- Django - 通用视图
- Django - 表单处理
- Django - 文件上传
- Django - Apache 配置
- Django - Cookie 处理
- Django - Session
- Django - 缓存
- Django - 评论
- Django - RSS
- Django - AJAX
- Django 资源推荐
- Django - 快速入门
- Django - 资源推荐
- 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 应该在 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 分钟。
**注意** - 如前所述,上述视图映射到:
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 %}
如上所示,cache 标签将有两个参数:您希望缓存块的时间(以秒为单位)和赋予缓存片段的名称。