詳解Django緩存處理中Vary頭部的使用
Vary 頭部定義了緩存機(jī)制在構(gòu)建其緩存鍵值時(shí)應(yīng)當(dāng)將哪個(gè)請(qǐng)求頭標(biāo)考慮在內(nèi)。 例如,如果網(wǎng)頁的內(nèi)容取決于用戶的語言偏好,該頁面被稱為根據(jù)語言而不同。
缺省情況下,Django 的緩存系統(tǒng)使用所請(qǐng)求的路徑(比如:"/stories/2005/jun/23/bank_robbed/" )來創(chuàng)建其緩存鍵。這意味著每次請(qǐng)求都會(huì)使用同樣的緩存版本,不考慮才客戶端cookie和語言配置的不同。 除非你使用Vary頭部通知緩存機(jī)制頁面輸出要依據(jù)請(qǐng)求頭里的cookie,語言等的設(shè)置而不同。
要在 Django 完成這項(xiàng)工作,可使用便利的 vary_on_headers 視圖裝飾器,如下所示:
from django.views.decorators.vary import vary_on_headers # Python 2.3 syntax. def my_view(request): # ... my_view = vary_on_headers(my_view, 'User-Agent') # Python 2.4+ decorator syntax. @vary_on_headers('User-Agent') def my_view(request): # ...
在這種情況下,緩存機(jī)制(如 Django 自己的緩存中間件)將會(huì)為每一個(gè)單獨(dú)的用戶瀏覽器緩存一個(gè)獨(dú)立的頁面版本。
使用 vary_on_headers 裝飾器而不是手動(dòng)設(shè)置 Vary 頭部(使用像 response['Vary'] = 'user-agent' 之類的代碼)的好處是修飾器在(可能已經(jīng)存在的) Vary 之上進(jìn)行 添加 ,而不是從零開始設(shè)置,且可能覆蓋該處已經(jīng)存在的設(shè)置。
你可以向 vary_on_headers() 傳入多個(gè)頭標(biāo):
@vary_on_headers('User-Agent', 'Cookie') def my_view(request): # ...
該段代碼通知上游緩存對(duì) 兩者 都進(jìn)行不同操作,也就是說 user-agent 和 cookie 的每種組合都應(yīng)獲取自己的緩存值。 舉例來說,使用 Mozilla 作為 user-agent 而 foo=bar 作為 cookie 值的請(qǐng)求應(yīng)該和使用 Mozilla 作為 user-agent 而 foo=ham 的請(qǐng)求應(yīng)該被視為不同請(qǐng)求。
由于根據(jù) cookie 而區(qū)分對(duì)待是很常見的情況,因此有 vary_on_cookie 裝飾器。 以下兩個(gè)視圖是等效的:
@vary_on_cookie def my_view(request): # ... @vary_on_headers('Cookie') def my_view(request): # ...
傳入 vary_on_headers 頭標(biāo)是大小寫不敏感的; "User-Agent" 與 "user-agent" 完全相同。
你也可以直接使用幫助函數(shù):django.utils.cache.patch_vary_headers。 該函數(shù)設(shè)置或增加 Vary header ,例如:
from django.utils.cache import patch_vary_headers def my_view(request): # ... response = render_to_response('template_name', context) patch_vary_headers(response, ['Cookie']) return response
patch_vary_headers 以一個(gè) HttpResponse 實(shí)例為第一個(gè)參數(shù),以一個(gè)大小寫不敏感的頭標(biāo)名稱列表或元組為第二個(gè)參數(shù)。
相關(guān)文章
python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法,實(shí)例分析了全排列的原理與Python實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03plt.figure()參數(shù)使用詳解及運(yùn)行演示
這篇文章主要介紹了plt.figure()參數(shù)使用詳解及運(yùn)行演示,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python Pytorch深度學(xué)習(xí)之圖像分類器
今天小編就為大家分享一篇關(guān)于Pytorch圖像分類器的文章,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-10-10pytorch中transform.Compose()用法詳解
PyTorch是一個(gè)開源的Python機(jī)器學(xué)習(xí)庫,基于Torch,用于自然語言處理等應(yīng)用程序,這篇文章主要介紹了pytorch中transform.Compose()用法,需要的朋友可以參考下2023-10-10Python數(shù)據(jù)可視化plt.savefig如何將圖片存入固定路徑
這篇文章主要介紹了Python數(shù)據(jù)可視化plt.savefig如何將圖片存入固定路徑問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09