Django4.0 緩存框架-視圖緩存

2022-03-17 14:35 更新

django.views.decorators.cache.cache_page(timeout, *, cache=None, key_prefix=None)

使用緩存框架的通用辦法是緩存視圖結(jié)果。?django.views.decorators.cache? 定義了一個 ?cache_page ?裝飾器,它將自動緩存視圖的響應:

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ...

?cache_page ?使用了一個單獨的參數(shù):緩存過期時間,以秒為單位。在上面的例子里,?my_view()? 視圖的結(jié)果將緩存15分鐘。(注意,我們用 60 * 15 這樣的方式編寫,目的是方便閱讀。 60 * 15 將計算為 900,也就是15分鐘乘以每分鐘60秒。)
?cache_page ?設(shè)置的緩存超時優(yōu)先于 ?Cache-Control ?頭中的 ?max-age?指令。
和緩存站點一樣,對視圖緩存,以 URL 為鍵。如果許多 URL 指向相同的視圖,每個 URL 將被單獨緩存。繼續(xù)以 ?my_view ?為例,如果你的 ?URLconf ?是這樣的:

urlpatterns = [
    path('foo/<int:code>/', my_view),
]

那么 ?/foo/1/? 和 ?/foo/23/? 的請求將被分別緩存,正如你所料。但一旦部分 URL (比如 ?/foo/23/? )已經(jīng)被請求,那么隨后的請求都將使用緩存。
?cache_page ?也可以傳遞可選關(guān)鍵字參數(shù) ?cache?,它指引裝飾器在緩存視圖結(jié)果時使用特定的緩存(來自 ?CACHES ?設(shè)置)。默認情況下,將使用默認緩存,但你可以指定任何你想要的緩存:

@cache_page(60 * 15, cache="special_cache")
def my_view(request):
    ...

你可以基于每個視圖覆蓋緩存前綴。?cache_page ?傳遞了一個可選關(guān)鍵字參數(shù) ?key_prefix ?,它的工作方式與中間件的 ?CACHE_MIDDLEWARE_KEY_PREFIX ?相同??梢赃@樣使用它:

@cache_page(60 * 15, key_prefix="site1")
def my_view(request):
    ...

?key_prefix ?和 ?cache ?參數(shù)可能需要被一起指定。?key_prefix ?參數(shù)和 ?CACHES ?下指定的 ?KEY_PREFIX ?將被連接起來。
此外, ?cache_page ?在響應中自動設(shè)置 ?Cache-Control? 和 ?Expires ?頭, 這會影響 下游緩存.

在 URLconf 中指定視圖緩存

上一節(jié)的例子硬編碼了視圖被緩存的事實,因為 ?cache_page ?改變了 ?my_view ?函數(shù)。這種方法將你的視圖和緩存系統(tǒng)耦合起來,這樣并不理想。例如,你可能想在其他沒有緩存的站點上重用這個視圖函數(shù),或者你可能想分發(fā)這個視圖給那些想使用視圖但不想緩存它們的人員。解決這些問題的辦法是在 ?URLconf ?中指定視圖緩存,而不是視圖函數(shù)旁邊指定。
當你在 ?URLconf ?中使用 ?cache_page ?時,可以這樣包裝視圖函數(shù)。這是之前提到的 ?URLconf?:

urlpatterns = [
    path('foo/<int:code>/', my_view),
]

將 ?my_view ?包含在 ?cache_page ?中:

from django.views.decorators.cache import cache_page

urlpatterns = [
    path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
]


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號