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