前面介紹了緩存的一些簡單知識以及在Django中如何設(shè)置參數(shù)來配置這些緩存,現(xiàn)在講講在django中如何使用緩存。
創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計制作的專業(yè)的建站公司,擁有經(jīng)驗豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨特的設(shè)計風(fēng)格。自公司成立以來曾獨立設(shè)計制作的站點數(shù)千家。(1)站點級緩存
站點級緩存指使用緩存緩存整個網(wǎng)站,需要添加兩個中間件到MIDDLEWRAE_CLASSES:django.middleware.UpdateCacheMiddleware和django.middleware.cache.FetchFromCacheMiddleware,注意的是,UpdateCache中間件一定要放在第一位,F(xiàn)etch中間件必須放最后(因為中間件的順序決定著運行的順序)見下面示例:
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', )
除了上面的設(shè)置外還需要在setting文件中增加以下設(shè)置:
CACHE_MIDDLEWARE_ALIAS:用來存儲的緩存別名
CACHE_MIDDLEWARE_SECONDS:每個頁面應(yīng)該被緩存的秒數(shù)
CACHE_MIDDLEWARE_KEY_PREFIX:關(guān)鍵的前綴,當(dāng)多個站點使用同一個配置的時候,這個可以設(shè)置可以避免發(fā)生沖突;如果你不在乎的話, 你可以是用一個空字符串,建議你別這樣做
如果請求或者響應(yīng)的頭部允許的時候,緩存中間件會緩存那些200的get或者head的相應(yīng)頁面。同一個url但是不同查詢參數(shù)會被認(rèn)為是不同的相應(yīng)從而被分別緩存。
如果你設(shè)置了CACHE_MIDDLEWARE_ANONYMOUS_ONLY為真,那么只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的做法,注意確保已經(jīng)啟用了認(rèn)證中間件。
緩存中間件希望一個head請求可以被 一個有相同響應(yīng)頭部的get請求的響應(yīng) 響應(yīng),因為這樣的話,緩存中間件可以直接用一個get響應(yīng)返回給一個head請求。
另外,緩存中間件會自動的設(shè)置少量的頭部信息給每一個HttpResponse:
當(dāng)一個新鮮的頁面被請求的時候,會用當(dāng)前時間打上一個Last_Modified的頭部
會用當(dāng)前時間加上CACHE_MIDDLEWARE_SECONDS的值設(shè)置給Expires頭部
用CACHE_MIDDLEWARE_SECONDS的值給Cache-Control頭部去設(shè)置一個頁面的大年齡(前提是視圖函數(shù)沒有設(shè)置該項)
(2)單個view緩存
django.views.decorators.cache.cache_page()
更加輕巧的緩存框架使用方法是對單個有效視圖的輸出進行緩存。 django.views.decorators.cache 定義了一個自動緩存視圖響應(yīng)的 cache_page裝飾器,使用非常簡單:
from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ....
cache_page只接受一個參數(shù)和兩個關(guān)鍵字參數(shù),
timeout是緩存時間,以秒為單位
cache:指定使用你的CACHES設(shè)置中的哪一個緩存后端
key_prefix:指定緩存前綴,可以覆蓋在配置文件中CACHE_MIDDLEWARE_KEY_PREFIX的值
和站點緩存一樣,視圖緩存與 URL 無關(guān)。如果多個 URL 指向同一視圖,每個URL將會分別緩存。 繼續(xù) my_view范例,如果 URLconf 如下所示:
urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', my_view), ]
發(fā)送到 /foo/1/ and /foo/23/ 會被分別緩存。但是一旦一個明確的 URL (e.g., /foo/23/) 已經(jīng)被請求過了, 之后再度發(fā)出的指向該 URL 的請求將使用緩存
(3)在url配置文件中使用緩存裝飾器
和上面的類似,裝飾器的位置發(fā)生了變化
from django.views.decorators.cache import cache_page urlpatterns = ('', (r'^foo/(\d{1,2})/$', cache_page(60 * 15)(my_view)), )
(4)模板片段緩存
如果想對緩存進行更多的控制,可以使用 cache模板標(biāo)簽來緩存模板的一個片段。 要讓模板處理這個標(biāo)簽,把{% load cache %} 放在緩存片段的上面。
標(biāo)簽{% cache %}將按給定的時間緩存包含塊中的內(nèi)容。它最少需要兩個參數(shù):緩存時間(以秒為單位);給緩存片段起的名稱。該名稱將不使能用變量。
{% load cache %} {% cache 500 sidebar %} .. sidebar .. {% endcache %}
sidebar就是要緩存的片段代碼,緩存的是這個片段。當(dāng)然也可以可以依據(jù)這個片段內(nèi)的動態(tài)內(nèi)容緩存多個版本。如上面例子中,可以給站點的每個用戶生成不同版本的sidebar緩存。只需要給 {% cache %}標(biāo)簽再傳遞一個參數(shù)來標(biāo)識區(qū)分這個緩存片段。
{% load cache %} {% cache 500 sidebar request.user.username %} .. sidebar for logged in user .. {% endcache %}
指定一個以上的參數(shù)來識別片段是一個很好的選擇,簡單的盡可能的傳遞需要的參數(shù)到{% cache %}。
(5)底層的緩存API
有時候不想緩存一個頁面,甚至不想某個頁面的一部分,只是想緩存某個數(shù)據(jù)庫檢索的結(jié)果,django提供了底層次的API,可以是用這些API來緩存任何粒度的數(shù)據(jù),模型對象的字符串,字典,列表等等。(實際上我就是用這種方法)
可以通過類字典對象django.core.cache.caches.訪問配置在CACHES 設(shè)置中的字典類對象。對同一線程相同的別名重復(fù)請求將返回相同的對象。
>>> from django.core.cache import caches >>> cache1 = caches['myalias'] >>> cache2 = caches['myalias'] >>> cache1 is cache2
True
如果key不存在,就會引發(fā)一個 InvalidCacheBackendError。
如果想了解所有的API,建議去看django\core\cache\backends目錄下的cache.py文件,這里僅僅列舉一些簡單的用法
下面是如何導(dǎo)入這個 API :
from django.core.cache import cache
基本的接口是 set(key, value, timeout_seconds) 和 get(key) :
‘hello, world!’
timeout_seconds 參數(shù)是可選的, 并且默認(rèn)為前面講過的 CACHE_BACKEND 設(shè)置中的 timeout 參數(shù).
如果對象在緩存中不存在, 或者緩存后端是不可達的, cache.get() 返回 None :
# Wait 30 seconds for ‘my_key’ to expire…
>>> cache.get(’my_key’)
None
>>> cache.get(’some_unset_key’)
None
不建議在緩存中保存 None 常量,因為你將無法區(qū)分所保存的 None 變量及由返回值 None 所標(biāo)識的緩存未中。
cache.get() 接受一個 缺省 參數(shù)。其指定了當(dāng)緩存中不存在該對象時所返回的值:
>>> 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}
如果某個緩存關(guān)鍵字不存在或者已超時, 它將不會被包含在字典中。下面是范例的延續(xù):
>>> cache.get_many(['a', 'b', 'c', 'd'])
{’a': 1, ‘b’: 2, ‘c’: 3}
最后,你可以用 cache.delete() 顯式地刪除關(guān)鍵字。這是在緩存中清除特定對象的簡單途徑。
>>> cache.delete(’a')
cache.delete() 沒有返回值, 不管給定的緩存關(guān)鍵字對應(yīng)的值存在與否, 它都將以同樣方式工作。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享名稱:Django的緩存(2)-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://aaarwkj.com/article46/iedhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、虛擬主機、品牌網(wǎng)站制作、網(wǎng)頁設(shè)計公司、軟件開發(fā)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容