次世代恐怖遊戲《木衛四協議》首席創意官專訪:真實到人物面板上的每個毛孔
阿新 • • 發佈:2022-12-07
目錄
在動態網站中,使用者所有的請求,伺服器都會去資料庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最後生成使用者看到的頁面.
當一個網站的使用者訪問量很大的時候,每一次的的後臺操作,都會消耗很多的服務端資源,所以必須使用快取來減輕後端伺服器的壓力.
快取是將一些常用的資料儲存記憶體或者memcache中,在一定的時間內有人來訪問這些資料時,則不再去執行資料庫及渲染等操作,而是直接從記憶體或memcache的快取中去取得資料,然後返回給使用者.
快取位置通過配置檔案來操作(以檔案快取為例子)
# 前後端混合開發快取的使用 #settings.py中配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定快取使用的引擎 'LOCATION': 'E:\cache測試', #指定快取的路徑 'TIMEOUT':300, #快取超時時間(預設為300秒,None表示永不過期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大快取記錄的數量(預設300) 'CULL_FREQUENCY': 3, # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3) } } } # 前後端分離快取的使用
快取的粒度:
-全站快取
-單頁面快取
在檢視函式上加裝飾器
-頁面區域性快取
單頁面快取
#views.py
@cache_page(5) # 表示快取5秒中
def test_cache(request):
import time
ctime = time.time()
return render(request, 'index.html', context={'ctime': ctime})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ ctime }} </body> </html>
頁面區域性快取
重新整理頁面時,整個網頁有一部分實現快取
def test_cache(request):
import time
ctime = time.time()
return render(request, 'index.html', context={'ctime': ctime})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!---<script src="../jQuery-3.6.0-min.js"></script>---> </head> <body> {{ ctime }} <hr> 頁面區域性快取 {% load cache %} {% cache 5 'name' %} #5表示5秒鐘,name是唯一key值 {{ ctime }} {% endcache %} </body> </html>
全站快取
既然是全站快取,當然要使用Django中的中介軟體.
使用者的請求通過中介軟體,經過一系列的認證等操作,如果請求的內容在快取中存在,則使用FetchFromCacheMiddleware獲取內容並返回給使用者
當返回給使用者之前,判斷快取中是否已經存在,如果不存在,則UpdateCacheMiddleware會將快取儲存至Django的快取之中,以實現全站快取
快取整個站點,是最簡單的快取方法
在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中介軟體
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware', #第一
.....
......
'django.middleware.cache.FetchFromCacheMiddleware', #最後
)
“update” 必須配置在第一個
“fetch” 必須配置在最後一個
#settings.py
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware', #響應HttpResponse中設定幾個headers
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware', #用來快取通過GET和HEAD方法獲取的狀態碼為200的響應
)
CACHE_MIDDLEWARE_SECONDS=10 #快取時間10秒鐘
檢視
from django.core.cache import cache
cache.set('key',value可以是任意資料型別)
cache.get('key')
#views.py
from django.core.cache import cache
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def test_cache(request):
p=Person('zhao','18')
cache.set('name', p)
return HttpResponse('資料放進去')
def test_cache2(request):
p = cache.get('name')
print(type(p))
print(p.name)
return HttpResponse('資料拿出來')
#urls.py
path('test/',views.test_cache),
path('test2/',views.test_cache2)