W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Vary 標(biāo)頭定義了緩存機(jī)制在構(gòu)建其緩存鍵時(shí)應(yīng)考慮哪些請(qǐng)求標(biāo)頭。 例如,如果網(wǎng)頁(yè)的內(nèi)容取決于用戶的語(yǔ)言偏好,則稱該頁(yè)面因語(yǔ)言而異。
默認(rèn)情況下,Django 的緩存系統(tǒng)使用請(qǐng)求的完全合格的URL創(chuàng)建它的緩存密鑰——例如,"https://www.example.com/stories/2005/?order_by=author"。這意味著對(duì)該 URL 的每個(gè)請(qǐng)求都將使用相同的緩存版本,而不管用戶代理差異(如 cookies 或語(yǔ)言首選項(xiàng))。但是,如果這個(gè)頁(yè)面基于請(qǐng)求頭(如 cookie、語(yǔ)言或用戶代理)中的某些差異而產(chǎn)生不同的內(nèi)容,則需要使用Vary標(biāo)頭來(lái)告訴緩存機(jī)制,頁(yè)面輸出取決于這些東西。
要在 Django 中執(zhí)行此操作,請(qǐng)使用方便的? django.views.decorators.vary.vary_on_headers()
?視圖裝飾器,像這樣:
from django.views.decorators.vary import vary_on_headers
@vary_on_headers('User-Agent')
def my_view(request):
...
在這里,一個(gè)緩存機(jī)制(比如 Django 自帶的緩存中間件)將為每一個(gè)唯一的用戶代理緩存一個(gè)獨(dú)立的頁(yè)面版本。
使用 ?vary_on_headers
?裝飾器而不是手動(dòng)設(shè)置 Vary 頭(使用 ?response.headers['Vary'] = 'user-agent'
?)的好處是,裝飾器 添加 到 Vary頭(可能已經(jīng)存在),而不是從頭開(kāi)始設(shè)置,可能會(huì)覆蓋已經(jīng)存在的東西。
你可以傳遞多個(gè)headers參數(shù)給 ?vary_on_headers()
?:
@vary_on_headers('User-Agent', 'Cookie')
def my_view(request):
...
這告訴下游緩存兩者有所不同,意味著每個(gè)用戶代理和 cookie 的組合將獲取它自己的緩存值。比如,一個(gè)請(qǐng)求帶有用戶代理 Mozilla 和 cookie 值 ?foo=bar
? 被認(rèn)為和用戶代理 Mozilla 和 cookie 值 ?foo=ham
? 是不同的。
因?yàn)?cookie 的變化如此普遍,所以這里有個(gè) ?django.views.decorators.vary.vary_on_cookie()
? 裝飾器。這兩個(gè)視圖是等價(jià)的:
@vary_on_cookie
def my_view(request):
...
@vary_on_headers('Cookie')
def my_view(request):
...
傳遞給 ?vary_on_headers
?的headers是不區(qū)分大小寫的;?User-Agent
? 和 ?user-agent
?是一樣的。
你也可以直接使用幫助函數(shù) ?django.utils.cache.patch_vary_headers()
? 。這個(gè)函數(shù)可以設(shè)置或添加 ?Vary header
? 。比如:
from django.shortcuts import render
from django.utils.cache import patch_vary_headers
def my_view(request):
...
response = render(request, 'template_name', context)
patch_vary_headers(response, ['Cookie'])
return response
?patch_vary_headers
?帶有一個(gè) ?HttpResponse
?作為它的第一個(gè)參數(shù),一個(gè)不區(qū)分大小寫的頭名的列表/元組作為它的第二個(gè)參數(shù)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: