Django4.0 緩存框架-使用其他標(biāo)頭控制高速緩存

2022-03-17 15:07 更新

緩存的其他問(wèn)題是數(shù)據(jù)的隱私和數(shù)據(jù)應(yīng)該存儲(chǔ)在緩存的級(jí)聯(lián)中的問(wèn)題。

用戶通常面臨兩種緩存:他們自己的瀏覽器緩存(私有緩存)和他們的提供者的緩存(公共緩存)。 公共緩存由多個(gè)用戶使用并由其他人控制。 這會(huì)給敏感數(shù)據(jù)帶來(lái)問(wèn)題——例如,您不希望將您的銀行帳號(hào)存儲(chǔ)在公共緩存中。 因此,Web 應(yīng)用程序需要一種方法來(lái)告訴緩存哪些數(shù)據(jù)是私有的,哪些是公共的。

解決方案是指出一個(gè)頁(yè)面的緩存應(yīng)該是私有的。在 Django中,使用 ?cache_control() ?。例子:

from django.views.decorators.cache import cache_control

@cache_control(private=True)
def my_view(request):
    ...

這個(gè)裝飾器負(fù)責(zé)在場(chǎng)景后面發(fā)送適當(dāng)?shù)?HTTP 頭。

注意,緩存控制設(shè)置“私有”和“公共”是互斥的。裝飾器確?!肮病敝噶畋灰瞥?,如果應(yīng)該設(shè)置“私有”(反之亦然)。這兩個(gè)指令的一個(gè)示例使用將是一個(gè)提供私人和公共條目的博客站點(diǎn)。公共條目可以緩存在任何共享緩存上。下面的代碼使用 ?patch_cache_control()?,手動(dòng)修改緩存控制頭的方法(內(nèi)部調(diào)用的是 ?cache_control()? 裝飾器):

from django.views.decorators.cache import patch_cache_control
from django.views.decorators.vary import vary_on_cookie

@vary_on_cookie
def list_blog_entries_view(request):
    if request.user.is_anonymous:
        response = render_only_public_entries()
        patch_cache_control(response, public=True)
    else:
        response = render_private_and_public_entries(request.user)
        patch_cache_control(response, private=True)

    return response

你也可以通過(guò)其他方式控制下游緩存。比如,即使你沒(méi)有使用 Django 服務(wù)器端的緩存框架,你仍然可以告訴客戶端使用 ?max-age? 指令緩存視圖一段時(shí)間。

from django.views.decorators.cache import cache_control

@cache_control(max_age=3600)
def my_view(request):
    ...

(如果你使用緩存中間件,它已經(jīng)使用 ?CACHE_MIDDLEWARE_SECONDS? 設(shè)置的值設(shè)置了 ?max-age? 。在這個(gè)例子里,?cache_control()? 裝飾器里自定義的 ?max_age? 將被優(yōu)先使用,頭值將被正確合并。)
任何有效的 ?Cache-Control? 響應(yīng)指令在 ?cache_control()? 中是有效的。這里有很多例子:

  • ?no_transform?=?True?
  • ?must_revalidate?=?True?
  • ?stale_while_revalidate?=?num_seconds?
  • ?no_cache?=?True?

已知指令的列表在 IANA registry 都能被找到(注意不是所有的都適用于響應(yīng))。
如果你想使用頭部來(lái)完全禁用緩存,?never_cache()? 是一個(gè)視圖裝飾器,用來(lái)添加頭部確保響應(yīng)不被瀏覽器或其他緩存進(jìn)行緩存。比如:

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
    ...


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)