Django4.0 緩存框架-使用Vary標頭

2022-03-17 15:03 更新

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ù)。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號