緩存是將一個(gè)請(qǐng)求的響應(yīng)內(nèi)容保存到內(nèi)存或者高速緩存系統(tǒng)(Memcache)中,若某個(gè)時(shí)間內(nèi)再次發(fā)生同一個(gè)請(qǐng)求,則不再去執(zhí)行請(qǐng)求響應(yīng)過(guò)程,而直接從內(nèi)存或高速緩存系統(tǒng)中獲取該請(qǐng)求的響應(yīng)內(nèi)容返回給用戶。
Django提供了5種不同的緩存方式:
- Memcached:高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)網(wǎng)站,以減輕數(shù)據(jù)庫(kù)負(fù)載。使用Memcache需要安裝系統(tǒng)服務(wù)器,適合超大型網(wǎng)站使用。
- 數(shù)據(jù)庫(kù)緩存:緩存信息存儲(chǔ)在網(wǎng)站數(shù)據(jù)庫(kù)的緩存表中,緩存表可以在項(xiàng)目的配置文件中配置,適合大中型網(wǎng)站使用。
- 文件系統(tǒng)緩存:緩存信息以文本文件格式保存,適合中小型網(wǎng)站使用。
- 本地內(nèi)存緩存:Django默認(rèn)的緩存保存方式,只適用于項(xiàng)目開(kāi)發(fā)測(cè)試。
- 虛擬緩存:Django內(nèi)置的虛擬緩存,實(shí)際上只提供緩存接口,并不能儲(chǔ)存緩存數(shù)據(jù),只用于開(kāi)發(fā)測(cè)試。
若在項(xiàng)目中使用緩存機(jī)制,首先需要在配置文件settings.py中設(shè)置緩存的相關(guān)配置。每種緩存方式的配置如下:
Memcached配置
#BACKEND用于配置緩存引擎,LOCATION是Memcached服務(wù)器的IP地址
CACHES = {
'default':{
#使用python-memcached模塊連接Memcached
'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
#使用pylibmc模塊連接Memcached
#'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION':[
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
數(shù)據(jù)庫(kù)緩存配置
#BACKEND用于配置緩存引擎,LOCATION用于數(shù)據(jù)表的命名
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'my_cache_table',
}
}
文件系統(tǒng)緩存
#BACKEND用于配置緩存引擎,LOCATION是文件保存的路徑
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION':'e:/mysite',
}
}
本地內(nèi)存緩存
#BACKEND用于配置緩存引擎,LOCATION對(duì)存儲(chǔ)器命名,用于識(shí)別耽擱存儲(chǔ)器
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
'LOCATION':'unique-snowflake',
}
}
虛擬緩存
#BACKEND用于配置緩存引擎
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.dummy.DummyCache',
}
}
上述緩存配置僅僅是基本配置,也就是說(shuō)緩存參數(shù)BACKEND和LOCATION是必須配置的,其余的配置參數(shù)可自行選擇。我們以數(shù)據(jù)庫(kù)緩存配置為例,完整的緩存配置如下:
#BACKEND用于配置緩存引擎,LOCATION用于數(shù)據(jù)表的命名
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'my_cache_table',
#設(shè)置緩存的生命周期,以秒為單位,若為None,則永不過(guò)期
'TIMEOUT': 60,
'OPTIONS':{
#MAX_ENTRIES代表最大緩存記錄的數(shù)量
'MAX_ENTRIES': 1000,
#當(dāng)緩存到達(dá)最大數(shù)量之后,設(shè)置剔除緩存的數(shù)量
'CULL_FREQUENCY': 3,
}
},
#設(shè)置多個(gè)緩存數(shù)據(jù)表
'mysite':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'mysite_cache_table',
}
當(dāng)配置完成數(shù)據(jù)庫(kù)緩存配置后,下一步是在數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)緩存表,緩存數(shù)據(jù)表的生成依賴于配置文件中DATABASES的配置信息,如果DATABASES配置了多個(gè)數(shù)據(jù)庫(kù),那么緩存數(shù)據(jù)表默認(rèn)在DATABASES 的default的數(shù)據(jù)庫(kù)中生成。在項(xiàng)目命令行下輸入python manage.py createcachetable指令即可創(chuàng)建緩存數(shù)據(jù)表。

創(chuàng)建緩存數(shù)據(jù)表之后,就可以在項(xiàng)目中是哪個(gè)緩存了。緩存的使用方式有4種,主要根據(jù)使用對(duì)象的不同來(lái)劃分,具體說(shuō)明如下:
- 全站緩存:將緩存作用于整個(gè)網(wǎng)站的全部頁(yè)面。一般情況下不采用這種方式實(shí)現(xiàn),會(huì)對(duì)數(shù)據(jù)庫(kù)或Memcached造成極大的壓力。
- 視圖緩存:將用戶請(qǐng)求的視圖函數(shù)緩存,節(jié)省視圖函數(shù)處理請(qǐng)求信息的時(shí)間和資源
- 路由(URL)緩存:作用與視圖緩存相同,但兩者是有區(qū)別的。如有兩個(gè)URL同時(shí)指向一個(gè)視圖函數(shù),分別訪問(wèn)這兩個(gè)URL時(shí),路由緩存會(huì)判斷URL是否生成緩存而決定是否執(zhí)行視圖函數(shù)。
- 模板緩存:對(duì)模板某部分的數(shù)據(jù)設(shè)置緩存,常用于模板內(nèi)容變動(dòng)較少的情況,如<head>標(biāo)簽。
全站緩存
全站緩存作用于整個(gè)網(wǎng)站,當(dāng)用戶向網(wǎng)站發(fā)送請(qǐng)求時(shí),首先經(jīng)過(guò)Django的中間件進(jìn)行處理。因此,使用全站緩存應(yīng)在Django的中間件中配置,配置信息如下:
MIDDLEWARE = [
#配置全站緩存
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
#使用中文
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
#配置全站緩存
'django.middleware.cache.FetchFromCacheMiddleware',
]
#設(shè)置緩存的生命周期,若在緩存配置CACHES中設(shè)置TIMEOUT屬性,則程序優(yōu)先選擇這里的設(shè)置
CACHE_MIDDLEWARE_SECONDS = 15
#設(shè)置緩存數(shù)據(jù)保存在數(shù)據(jù)表my_cache_table中,屬性值default來(lái)自于緩存配置CACHES的default屬性
CACHE_MIDDLEWARE_ALIAS = 'default'
#設(shè)置緩存表字段cache_key的值,用于同一個(gè)Django項(xiàng)目多個(gè)站點(diǎn)之間的共享緩存
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite'
啟動(dòng)mysite項(xiàng)目,在瀏覽器上訪問(wèn)的頁(yè)面都會(huì)在緩存數(shù)據(jù)表my_cache_table上生成相應(yīng)的緩存信息。

視圖緩存
視圖緩存是將視圖函數(shù)執(zhí)行過(guò)程中生成緩存數(shù)據(jù),主要以裝飾器的形式來(lái)實(shí)現(xiàn)。裝飾器有三個(gè)參數(shù):timeout、cache和key_prefix,參數(shù)timeout是必選參數(shù),其余兩個(gè)是可選參數(shù)。
#index 的 views.py
from django.views.decorators.cache import cache_page
#參數(shù)cache與全站緩存CACHE_MIDDLEWARE_ALIAS相同
#參數(shù)key_prefix與全站緩存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(timeout=10, cache='mysite', key_prefix='mysiteView')
@login_required(login_url='/user/login.html')
def shoppingCarView(request):
pass
return render(request, 'shoppingCar.html', locals())
在瀏覽器上訪問(wèn)購(gòu)物車頁(yè)面,打開(kāi)數(shù)據(jù)庫(kù)查看數(shù)據(jù)緩存表mysite_cache_table的視圖緩存信息,如下圖:

路由緩存
路由緩存主要在路由配置urls.py中實(shí)現(xiàn),路由緩存cache_page有三個(gè)參數(shù),分別是timeout、cache和key_prefix,參數(shù)timeout是必選參數(shù),其余兩個(gè)參數(shù)是可選參數(shù),參數(shù)的含義與視圖緩存的參數(shù)一致。
代碼如下:
#index的urls.py
from django.urls import path, re_path
from . import views
from django.views.decorators.cache import cache_page
urlpatterns = [
path('', cache_page(timeout=10,cache='mysite',key_prefix='mysiteURL')(views.index), name='index'),
path('shoppingCar.html', views.shoppingCarView, name='shoppingCar'),
]
在瀏覽器訪問(wèn)首頁(yè),打開(kāi)數(shù)據(jù)庫(kù)查看緩存數(shù)據(jù)表mysite_cache_table查看路由緩存信息。

模板緩存
模板緩存是通過(guò)Django的緩存標(biāo)簽實(shí)現(xiàn)的,緩存標(biāo)簽只支持兩個(gè)參數(shù):timeout和key_prefix,以index.html為例實(shí)現(xiàn)模板緩存,代碼如下:
{# 設(shè)置緩存 #}
{% load cache %}
{% cache 10 mysiteTemp %}
<div>要緩存的內(nèi)容</div>
{# 緩存結(jié)束 #}
{% endcache %}
模板緩存的緩存信息默認(rèn)存儲(chǔ)在數(shù)據(jù)表my_cache_table中,打開(kāi)數(shù)據(jù)庫(kù)查看數(shù)據(jù)表my_cache_table的模板緩存信息如下:
