中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django的緩存(2)

發布時間:2020-07-01 05:49:18 來源:網絡 閱讀:1089 作者:孤雁不獨飛 欄目:開發技術

  前面介紹了緩存的一些簡單知識以及在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() 沒有返回值, 不管給定的緩存關鍵字對應的值存在與否, 它都將以同樣方式工作。




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

婺源县| 建始县| 永寿县| 永新县| 渝北区| 汝阳县| 石楼县| 民和| 铁岭县| 仁布县| 通山县| 新和县| 柘荣县| 吴旗县| 黎城县| 莲花县| 红河县| 拉萨市| 安泽县| 洮南市| 仁怀市| 剑河县| 舟曲县| 开远市| 禄丰县| 潮安县| 岳阳县| 福安市| 汾阳市| 卓尼县| 万宁市| 肇州县| 西吉县| 胶州市| 兰坪| 沙坪坝区| 乐平市| 凤山县| 海兴县| 临夏市| 南陵县|