您好,登錄后才能下訂單哦!
前面介紹了緩存的一些簡單知識以及在Django中如何設置參數來配置這些緩存,現在講講在django中如何使用緩存。
(1)站點級緩存
站點級緩存指使用緩存緩存整個網站,需要添加兩個中間件到MIDDLEWRAE_CLASSES:django.middleware.UpdateCacheMiddleware和django.middleware.cache.FetchFromCacheMiddleware,注意的是,UpdateCache中間件一定要放在第一位,Fetch中間件必須放最后(因為中間件的順序決定著運行的順序)見下面示例:
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', )
除了上面的設置外還需要在setting文件中增加以下設置:
CACHE_MIDDLEWARE_ALIAS:用來存儲的緩存別名
CACHE_MIDDLEWARE_SECONDS:每個頁面應該被緩存的秒數
CACHE_MIDDLEWARE_KEY_PREFIX:關鍵的前綴,當多個站點使用同一個配置的時候,這個可以設置可以避免發生沖突;如果你不在乎的話, 你可以是用一個空字符串,建議你別這樣做
如果請求或者響應的頭部允許的時候,緩存中間件會緩存那些200的get或者head的相應頁面。同一個url但是不同查詢參數會被認為是不同的相應從而被分別緩存。
如果你設置了CACHE_MIDDLEWARE_ANONYMOUS_ONLY為真,那么只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的做法,注意確保已經啟用了認證中間件。
緩存中間件希望一個head請求可以被 一個有相同響應頭部的get請求的響應 響應,因為這樣的話,緩存中間件可以直接用一個get響應返回給一個head請求。
另外,緩存中間件會自動的設置少量的頭部信息給每一個HttpResponse:
當一個新鮮的頁面被請求的時候,會用當前時間打上一個Last_Modified的頭部
會用當前時間加上CACHE_MIDDLEWARE_SECONDS的值設置給Expires頭部
用CACHE_MIDDLEWARE_SECONDS的值給Cache-Control頭部去設置一個頁面的最大年齡(前提是視圖函數沒有設置該項)
(2)單個view緩存
django.views.decorators.cache.cache_page()
更加輕巧的緩存框架使用方法是對單個有效視圖的輸出進行緩存。 django.views.decorators.cache 定義了一個自動緩存視圖響應的 cache_page裝飾器,使用非常簡單:
from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ....
cache_page只接受一個參數和兩個關鍵字參數,
timeout是緩存時間,以秒為單位
cache:指定使用你的CACHES設置中的哪一個緩存后端
key_prefix:指定緩存前綴,可以覆蓋在配置文件中CACHE_MIDDLEWARE_KEY_PREFIX的值
和站點緩存一樣,視圖緩存與 URL 無關。如果多個 URL 指向同一視圖,每個URL將會分別緩存。 繼續 my_view范例,如果 URLconf 如下所示:
urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', my_view), ]
發送到 /foo/1/ and /foo/23/ 會被分別緩存。但是一旦一個明確的 URL (e.g., /foo/23/) 已經被請求過了, 之后再度發出的指向該 URL 的請求將使用緩存
(3)在url配置文件中使用緩存裝飾器
和上面的類似,裝飾器的位置發生了變化
from django.views.decorators.cache import cache_page urlpatterns = ('', (r'^foo/(\d{1,2})/$', cache_page(60 * 15)(my_view)), )
(4)模板片段緩存
如果想對緩存進行更多的控制,可以使用 cache模板標簽來緩存模板的一個片段。 要讓模板處理這個標簽,把{% load cache %} 放在緩存片段的上面。
標簽{% cache %}將按給定的時間緩存包含塊中的內容。它最少需要兩個參數:緩存時間(以秒為單位);給緩存片段起的名稱。該名稱將不使能用變量。
{% load cache %} {% cache 500 sidebar %} .. sidebar .. {% endcache %}
sidebar就是要緩存的片段代碼,緩存的是這個片段。當然也可以可以依據這個片段內的動態內容緩存多個版本。如上面例子中,可以給站點的每個用戶生成不同版本的sidebar緩存。只需要給 {% cache %}標簽再傳遞一個參數來標識區分這個緩存片段。
{% load cache %} {% cache 500 sidebar request.user.username %} .. sidebar for logged in user .. {% endcache %}
指定一個以上的參數來識別片段是一個很好的選擇,簡單的盡可能的傳遞需要的參數到{% cache %}。
(5)底層的緩存API
有時候不想緩存一個頁面,甚至不想某個頁面的一部分,只是想緩存某個數據庫檢索的結果,django提供了底層次的API,可以是用這些API來緩存任何粒度的數據,模型對象的字符串,字典,列表等等。(實際上我就是用這種方法)
可以通過類字典對象django.core.cache.caches.訪問配置在CACHES 設置中的字典類對象。對同一線程相同的別名重復請求將返回相同的對象。
>>> from django.core.cache import caches >>> cache1 = caches['myalias'] >>> cache2 = caches['myalias'] >>> cache1 is cache2
True
如果key不存在,就會引發一個 InvalidCacheBackendError。
如果想了解所有的API,建議去看django\core\cache\backends目錄下的cache.py文件,這里僅僅列舉一些簡單的用法
下面是如何導入這個 API :
from django.core.cache import cache
基本的接口是 set(key, value, timeout_seconds) 和 get(key) :
‘hello, world!’
timeout_seconds 參數是可選的, 并且默認為前面講過的 CACHE_BACKEND 設置中的 timeout 參數.
如果對象在緩存中不存在, 或者緩存后端是不可達的, cache.get() 返回 None :
# Wait 30 seconds for ‘my_key’ to expire…
>>> cache.get(’my_key’)
None
>>> cache.get(’some_unset_key’)
None
不建議在緩存中保存 None 常量,因為你將無法區分所保存的 None 變量及由返回值 None 所標識的緩存未中。
cache.get() 接受一個 缺省 參數。其指定了當緩存中不存在該對象時所返回的值:
>>> cache.get(’my_key’, ‘has expired’)
‘has expired’
要想一次獲取多個緩存值,可以使用 cache.get_many() 。如果可能的話,對于給定的緩存后端, get_many() 將只訪問緩存一次,而不是對每個緩存鍵值都進行一次訪問。 get_many() 所返回的字典包括了你所請求的存在于緩存中且未超時的所有鍵值。
>>> cache.set(’a', 1) >>> cache.set(’b', 2) >>> cache.set(’c', 3) >>> cache.get_many(['a', 'b', 'c'])
{’a': 1, ‘b’: 2, ‘c’: 3}
如果某個緩存關鍵字不存在或者已超時, 它將不會被包含在字典中。下面是范例的延續:
>>> cache.get_many(['a', 'b', 'c', 'd'])
{’a': 1, ‘b’: 2, ‘c’: 3}
最后,你可以用 cache.delete() 顯式地刪除關鍵字。這是在緩存中清除特定對象的簡單途徑。
>>> cache.delete(’a')
cache.delete() 沒有返回值, 不管給定的緩存關鍵字對應的值存在與否, 它都將以同樣方式工作。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。