Django4.0 緩存框架-使用其他標頭控制高速緩存

2022-03-17 15:07 更新

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

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

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

from django.views.decorators.cache import cache_control

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

這個裝飾器負責在場景后面發(fā)送適當?shù)?HTTP 頭。

注意,緩存控制設(shè)置“私有”和“公共”是互斥的。裝飾器確保“公共”指令被移除,如果應(yīng)該設(shè)置“私有”(反之亦然)。這兩個指令的一個示例使用將是一個提供私人和公共條目的博客站點。公共條目可以緩存在任何共享緩存上。下面的代碼使用 ?patch_cache_control()?,手動修改緩存控制頭的方法(內(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

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

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? 。在這個例子里,?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))。
如果你想使用頭部來完全禁用緩存,?never_cache()? 是一個視圖裝飾器,用來添加頭部確保響應(yīng)不被瀏覽器或其他緩存進行緩存。比如:

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
    ...


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號