Django緩存的介紹html
配置(settings.py設置不一樣緩存介質)python
實測redis
除了Django這個web框架以外、其餘框架都沒有緩存。Django的配置一下就可使用。數據庫
Django中提供了5種緩存方式:django
官網:https://docs.djangoproject.com/en/1.9/topics/cache/windows
http://docs.30c.org/djangobook2/chapter15/後端
# 此爲開始調試用,實際內部不作任何操做 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 'TIMEOUT': 300, # 緩存超時時間(默認300,None表示永不過時,0表示當即過時) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存個數(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認剔除1/3) }, 'KEY_PREFIX': '', # 緩存key的前綴(默認空) 'VERSION': 1, # 緩存key的版本(默認1) 'KEY_FUNCTION' 函數名 # 生成key的函數(默認函數會生成爲:【前綴:版本:key】) } } # 自定義key 名 def default_key_func(key, key_prefix, version): """ Default function to generate keys. Constructs the key used by all other methods. By default it prepends the `key_prefix'. KEY_FUNCTION can be used to specify an alternate function with custom key making behavior. """ return '%s:%s:%s' % (key_prefix, version, key) def get_key_func(key_func): """ Function to decide which key function to use. Defaults to ``default_key_func``. """ if key_func is not None: if callable(key_func): return key_func else: return import_string(key_func) return default_key_func
# 此緩存將內容保存至內存的變量中 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } } # 注:其餘配置同開發調試版本
# 此緩存將內容保存至文件 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', # 'LOCATION': os.path.join(BASE_DIR,'cache'), } } # 注:其餘配置同開發調試版本
# 此緩存將內容保存至數據庫 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 數據庫表 } } # 注:執行建立表命令 python manage.py createcachetable
# 此緩存使用python-memcached模塊鏈接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { # 鏈接本地cookie 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', } } # 能夠配置多個,鏈接多個memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', # ('172.19.26.240:11211',10) 調權重 # ('172.19.26.242:11211',11) 調權重,memcache模塊實現的 ] } }
# 此緩存使用pylibmc模塊鏈接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
注意:以上配置都可CACHES中同時配置,只需配置不同的名字便可緩存
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', }, 'file': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 'LOCATION': '/var/tmp/django_cache', # 這個是文件夾的路徑 'LOCATION': r'D:\Python相關\過程project\django複習\first_review\testcaches\caches_files',#windows下的示例 } } CACHE_MIDDLEWARE_ALIAS = "file" # 只需設置使用的別名的便可
補充:rediscookie
pip install django-redis apt-get install redis-server 而後在settings.py 裏面添加CACHES = { 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', 'LOCATION': '127.0.0.1:6379', "OPTIONS": { "CLIENT_CLASS": "redis_cache.client.DefaultClient", }, }
@cache_page(15) #超時時間爲15秒,這15秒是暫存的狀態,當過了15秒又是新狀態了
""" 'django.middleware.cache.UpdateMiddleware', 服務端響應response時做用 查看是否有緩存,若是沒有則寫入緩存,不然直接返回給客戶端 'django.middleware.cache.FetchFormCacheMiddleware', 客戶端請求request時做用 查看是否有緩存,若是有不通過views直接返回,不然進入views視圖執行函數獲取緩存 客戶端第一次發出請求是一般是沒有緩存的, 所以request請求由中間件FetchForm通過檢查沒有緩存後進入views 而後response攜帶緩存到中間件Update後寫入緩存,再返回給客戶端 """ # 使用中間件,通過一系列的認證等操做, # 若是內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶, # 當返回給用戶以前,判斷緩存中是否已經存在, # 若是不存在則UpdateCacheMiddleware會將緩存保存至緩存,從而實現全站緩存 MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 只有process_response # 其餘中間件... 'django.middleware.cache.FetchFromCacheMiddleware', # 只有process_view ] CACHE_MIDDLEWARE_ALIAS = 'default' #用來存儲的緩存別名,多CACHES配置了多個緩存配置,則用此配置進行設置 CACHE_MIDDLEWARE_SECONDS = 0 #全部頁面默認緩存時間,默認600 CACHE_MIDDLEWARE_KEY_PREFIX ='www.demo.com' #關鍵的前綴,當多個站點使用同一個配置的時候,這個能夠設置能夠避免發生衝突,通常設置爲網站域名 CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #那麼只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的作法,注意確保已經啓用了Django用戶認證中間件
cache_page只接受一個參數和兩個關鍵字參數
注意:cache_page裝飾器的方式,即便沒有設置緩存中間件,只要設置的緩存方式,也同樣能夠緩存
timeout是緩存時間,以秒爲單位
cache:指定使用你的CACHES設置中的哪個緩存後端
key_prefix:指定緩存前綴,能夠覆蓋在配置文件中CACHE_MIDDLEWARE_KEY_PREFIX的
方式一 FBV from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ... 方法二 CBV from django.views.decorators.cache import cache_page from django.utils.decorators import method_decorator from django.views import View class Index(View): @method_decorator(cache_page(5)) def get(self,request): .... 方式三: from django.views.decorators.cache import cache_page urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)), ]
a. 引入TemplateTag
{% load cache %}
b. 使用緩存
{% cache 5000 緩存key %} //單位秒
緩存內容
{% endcache %}
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': os.path.join(BASE_DIR,'cache'), } } # CACHE_MIDDLEWARE_ALIAS = "" CACHE_MIDDLEWARE_SECONDS = 5 # CACHE_MIDDLEWARE_KEY_PREFIX = ""
from django.shortcuts import render,HttpResponse import time from django.views.decorators.cache import cache_page # @cache_page(60 * 15) # 15分鐘:60秒 * 15 # @cache_page(5) # 5秒 # def index(request): # ctime = time.time() # print(ctime) # return render(request,"index1.html",{"ctime":ctime}) def index(request): ctime = time.time() print(ctime) return render(request,"index1.html",{"ctime":ctime})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>{{ ctime }}</h2> </body> </html>
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': os.path.join(BASE_DIR,'cache'), # 新建文件夾 cache } }
from django.shortcuts import render,HttpResponse import time from django.views.decorators.cache import cache_page # @cache_page(60 * 15) # 15分鐘:60秒 * 15 @cache_page(5) # 5秒 def index(request): ctime = time.time() print(ctime) return render(request,"index1.html",{"ctime":ctime})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2>{{ ctime }}</h2> </body> </html>
cache文件夾多了一些緩存數據
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': os.path.join(BASE_DIR,'cache'), } }
from django.shortcuts import render,HttpResponse import time from django.views.decorators.cache import cache_page # @cache_page(60 * 15) # 15分鐘:60秒 * 15 # @cache_page(5) # 5秒 # def index(request): # ctime = time.time() # print(ctime) # return render(request,"index1.html",{"ctime":ctime}) def index(request): ctime = time.time() print(ctime) return render(request,"index2.html",{"ctime":ctime})
{% load cache %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>{{ ctime }}</h3> {% cache 5 "kkk" %} <h3>{{ ctime }}</h3> {% endcache %} </body> </html>
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '1.1.1.39:12000', "TIMEOUT":5, } } # CACHE_MIDDLEWARE_ALIAS = "" CACHE_MIDDLEWARE_SECONDS = 5 # CACHE_MIDDLEWARE_KEY_PREFIX = ""
實測有效。