Django回顧7

一.Django緩存

1.緩存介紹

在動態網站中,用戶所有的請求,服務器都會去數據庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最后生成用戶看到的頁面.
當一個網站的用戶訪問量很大的時候,每一次的的后臺操作,都會消耗很多的服務端資源,所以必須使用緩存來減輕后端服務器的壓力.
緩存是將一些常用的數據保存內存或者memcache中,在一定的時間內有人來訪問這些數據時,則不再去執行數據庫及渲染等操作,而是直接從內存或memcache的緩存中去取得數據,然后返回給用戶

2.Django中的6種緩存方式

  • 開發調試緩存
  • 內存緩存
  • 文件緩存
  • 數據庫緩存
  • Memcache緩存(使用python-memcached模塊)
  • Memcache緩存(使用pylibmc模塊)

經常使用的有:文件緩存和Mencache緩存

3.Django6種緩存的配置

開發調試緩存(此模式為開發調試使用,實際上不執行任何操作)

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 緩存后臺使用的引擎'TIMEOUT': 300,            # 緩存超時時間(默認300秒,None表示永不過期,0表示立即過期)'OPTIONS':{'MAX_ENTRIES': 300,          # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3,          # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)},}
}

內存緩存(將緩存內容保存至內存區域中)

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定緩存使用的引擎'LOCATION': 'unique-snowflake',         # 寫在內存中的變量的唯一值 'TIMEOUT':300,             # 緩存超時時間(默認為300秒,None表示永不過期)'OPTIONS':{'MAX_ENTRIES': 300,           # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3,          # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)}  }
}

文件緩存(把緩存數據存儲在文件中)

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定緩存使用的引擎'LOCATION': '/var/tmp/django_cache',        #指定緩存的路徑'TIMEOUT':300,              #緩存超時時間(默認為300秒,None表示永不過期)'OPTIONS':{'MAX_ENTRIES': 300,            # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3,           # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)}}   
}

數據庫緩存(把緩存數據存儲在數據庫中)

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定緩存使用的引擎'LOCATION': 'cache_table',          # 數據庫表    'OPTIONS':{'MAX_ENTRIES': 300,           # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3,          # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)}  }   
}

注意,創建緩存的數據庫表使用的語句:

python manage.py createcachetable

Memcached緩存(使用python-memcached模塊連接memcache)

settings.py:

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定緩存使用的引擎'LOCATION': '192.168.10.100:11211',         # 指定Memcache緩存服務器的IP地址和端口'OPTIONS':{'MAX_ENTRIES': 300,            # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3,           # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)}}
}

LOCATION也可以配置成如下:

'LOCATION': 'unix:/tmp/memcached.sock',   # 指定局域網內的主機名加socket套接字為Memcache緩存服務器
'LOCATION': [         # 指定一臺或多臺其他主機ip地址加端口為Memcache緩存服務器'192.168.10.100:11211','192.168.10.101:11211','192.168.10.102:11211',
]

Memcache緩存(使用pylibmc模塊連接memcache)

settings.py文件配置CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  # 指定緩存使用的引擎'LOCATION':'192.168.10.100:11211',         # 指定本機的11211端口為Memcache緩存服務器'OPTIONS':{'MAX_ENTRIES': 300,            # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3,           # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)},  }}

LOCATION也可以配置成如下:

'LOCATION': '/tmp/memcached.sock',  # 指定某個路徑為緩存目錄
'LOCATION': [       # 分布式緩存,在多臺服務器上運行Memcached進程,程序會把多臺服務器當作一個單獨的緩存,而不會在每臺服務器上復制緩存值'192.168.10.100:11211','192.168.10.101:11211','192.168.10.102:11211',
]

4.Django中的緩存應用

Django提供了不同力度的緩存,可以緩存某個頁面,可以只緩存一個頁面的某個部分,甚至可以緩存整個網站

數據庫:

class Book(models.Model):name=models.CharField(max_length=32)price=models.DecimalField(max_digits=6,decimal_places=1)

(1)視圖函數使用緩存

視圖:
from django.views.decorators.cache import cache_page
import time
from .models import *@cache_page(15)          #超時時間為15秒
def index(request):t=time.time()      #獲取當前時間bookList=Book.objects.all()return render(request,"index.html",locals())
模板(index.html):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>當前時間:-----{{ t }}</h3><ul>{% for book in bookList %}<li>{{ book.name }}--------->{{ book.price }}$</li>{% endfor %}
</ul></body>
</html>

上面的例子是基于內存的緩存配置,基于文件的緩存該怎么配置呢?

更改settings.py的配置

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定緩存使用的引擎'LOCATION': 'E:\django_cache',          # 指定緩存的路徑'TIMEOUT': 300,              # 緩存超時時間(默認為300秒,None表示永不過期)'OPTIONS': {'MAX_ENTRIES': 300,            # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3,           # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)}}
}

然后再次刷新瀏覽器,可以看到在剛才配置的目錄下生成的緩存文件
通過實驗可以知道,Django會以自己的形式把緩存文件保存在配置文件中指定的目錄里

(2)全站使用緩存

既然是全站緩存,就要使用Django中間件
用戶的請求通過中間件,經過一系列的認證等操作,如果請求的內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容并返回給用戶
當返回給用戶之前,判斷緩存中是否已經存在,如果不存在,則UpdateCacheMiddleware會將緩存保存至Django的緩存之中,以實現全站緩存

緩存整個站點,是最簡單的緩存方法在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中間件
MIDDLEWARE_CLASSES = (‘django.middleware.cache.UpdateCacheMiddleware’, #第一'django.middleware.common.CommonMiddleware',‘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
視圖函數:
from django.views.decorators.cache import cache_page
import time
from .models import *def index(request):t=time.time()      #獲取當前時間bookList=Book.objects.all()return render(request,"index.html",locals())def foo(request):t=time.time()      #獲取當前時間return HttpResponse("HELLO:"+str(t))
模板(index.html):
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3 style="color: green">當前時間:-----{{ t }}</h3><ul>{% for book in bookList %}<li>{{ book.name }}--------->{{ book.price }}$</li>{% endfor %}
</ul></body>
</html>

其余代碼不變,刷新瀏覽器是10s,頁面上的時間變化一次,這樣就實現了全站緩存

(3)局部視圖緩存

刷新網頁時,整個網頁有一部分實現緩存

views視圖函數:
from django.views.decorators.cache import cache_page
import time
from .models import *
def index(request):t=time.time()      #獲取當前時間bookList=Book.objects.all()return render(request,"index.html",locals())
模板(index.html):
{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3 style="color: green">不緩存:-----{{ t }}</h3>{% cache 2 'name' %}<h3>緩存:-----:{{ t }}</h3>
{% endcache %}</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210849.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法:最長公共前綴(橫向掃描和縱向掃描)

橫向掃描 時間復雜度 O(m * n)&#xff0c;空間復雜度O(1) /*** param {string[]} strs* return {string}*/ var longestCommonPrefix function(strs) {// 先把第一個字符串拿出來let str strs[0]// 用 startsWith 檢查數組中每個字符串是否以當前字符串為前綴while(!strs.e…

聽GPT 講Rust源代碼--src/tools(11)

File: rust/src/tools/rust-analyzer/crates/hir/src/lib.rs 在Rust源代碼中&#xff0c;rust/src/tools/rust-analyzer/crates/hir/src/lib.rs文件的作用是定義了Rust語言的高級抽象層次&#xff08;Higher-level IR&#xff0c;HIR&#xff09;。它包含了Rust語言的各種結構和…

Python:核心知識點整理大全10-筆記

目錄 5.4 使用 if 語句處理列表 5.4.1 檢查特殊元素 toppings.py 5.4.2 確定列表不是空的 5.4.3 使用多個列表 5.5 設置 if 語句的格式 5.6 小結 第6章 字 典 6.1 一個簡單的字典 alien.py 6.2 使用字典 6.2.1 訪問字典中的值 6.2.2 添加鍵—值對 6.2.3 先創建一…

智能優化算法應用:基于蜉蝣算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于蜉蝣算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于蜉蝣算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.蜉蝣算法4.實驗參數設定5.算法結果6.參考文獻7.MA…

JAVA+SSM+springboot+MYSQL企業物資庫存進銷存管理系統

。該系統從兩個對象&#xff1a;由管理員和員工來對系統進行設計構建。主要功能包括首頁、個人中心、員工管理、項目信息管理、倉庫信息管理、供應商管理、項目計劃管理、物資庫存管理、到貨登記管理、物資出庫管理、物資入庫管理等功能進行管理。本企業物資管理系統方便員工快…

linux 定時任務

使用 crontab Usage: crontab [-u user] [-e|-l|-r] Crontab 的格式說明如下: * 逗號(‘,’) 指定列表值。如: “1,3,4,7,8″ * 中橫線(‘-’) 指定范圍值 如 “1-6″, 代表 “1,2,3,4,5,6″ * 星號 (‘*’) 代表所有可能的值 */15 表示每 15 分鐘執行一次 # Use the ha…

C++編程法則365天一天一條(24)RTTI運行時類型信息typeid和type_info

文章目錄 基本用法編譯時或運行時判定 基本用法 typeid 是 C 的一個運算符&#xff0c;它用于獲取表達式的類型信息。它返回一個 std::type_info 對象引用&#xff0c;該對象包含有關表達式的類型的信息。 要使用 typeid 運算符&#xff0c;需要包含 <typeinfo> 頭文件…

關于振動試驗

這是試驗的說明&#xff08;來自gbt4710-2009&#xff09; 這是試驗的參數&#xff1a; 一、試驗方向&#xff1a; 振動試驗中有幾個方向 除有關規范另有規定外&#xff0c;應在產品的三個互相垂直方向上進行振動試驗。 一般定義產品長邊為X軸向&#xff0c;短邊為Y軸向&…

飛書面試題匯總

面試相關經驗 Interview | JavaGuide(Java面試 學習指南) 同學1 7次面試 編程題匯總&#xff1a; 有序鏈表找中位數 &#xff08;飛書1面&#xff09; m個有序數組合并 &#xff08;飛書1面&#xff09; 海量數據尋找TopK&#xff08;口述&#xff09; &#xff08;飛書…

Android 10(Q) 以上普通 APP 隱藏應用圖標問題探究及解決方案

1、實驗環境 aosp 版本 10.0 系統 aosp 版本 13.0 系統 2、驗證結果 2.1 方式一 APP AndroidManifest.xml 中通過 activity-alias 配置帶 LAUNCHER 屬性 category&#xff0c;并且 android:enabled“true” 10.0 系統中可安裝后正常顯示 icon&#xff0c;通過 setComponen…

idea中run和debug是灰色的

【現象】idea中run和debug是灰色的 點擊 旁邊的Add Configuration…一看都是空白 【解決方法】&#xff1a; npm點開之后 【結果】

文本轉圖像 學習筆記

VQGAN (Vector Quantized Generative Adversarial Network) 是一種基于 GAN 的生成模型&#xff0c;可以將圖像或文本轉換為高質量的圖像。 VQ &#xff08;Vector Quantization&#xff09;是一種數據壓縮技術&#xff0c;是指將連續數據表示為離散化的向量。輸入的圖像或文本…

轉換NC或HDF數據時候轉出數據無坐標信息的處理方法

有時候我們在轉換NC或HDF數據時&#xff0c;有時候會出現沒有坐標信息的情況&#xff01;如下圖&#xff1a; 這種情況一般是原始數據將坐標信息存儲在說明文件中以便后期做生成坐標信息的處理、或坐標存儲的形式比較特殊&#xff0c;造成工具無法讀取&#xff01;這種數據處理…

Python迭代器與生成器研究記錄

Python迭代器與生成器研究記錄 前言 迭代器肯定是可迭代對象&#xff0c;但是可迭代對象不一定是迭代器&#xff0c;生成器一定是迭代器&#xff0c;但是迭代器不一定是生成器 生成器是特殊的迭代器&#xff0c;所以生成器一定是迭代器&#xff0c;迭代器一定是可迭代對象 我…

YOLOv8分割訓練及分割半自動標注

YOLOv8是基于目標檢測算法YOLOv5的改進版,它在YOLOv5的基礎上進行了優化和改進,加入了一些新的特性和技術,如切片注意力機制、骨干網絡的選擇等。 本文以yolov8-seg為基準,主要整理分割訓練流程及使用v8分割模型進行半自動標注的過程。 一、v8-seg訓練 1.1 環境配置 github…

【Altera】平臺設計器互連會回壓 AXI 接口怎么辦

說明 實現 AXI 接口的所有組件都具有發行或接受能力設置。每當互連檢測到管理器&#xff08;主管理器&#xff09;發出的事務多于管理器的發行容量設置時&#xff0c;互連將通過斷言 AxREADY 向管理器背壓。每當互連檢測到從屬&#xff08;從站&#xff09;接收的事務多于從屬的…

實用篇 | 一文快速構建人工智能前端展示streamlit應用

----------------------- &#x1f388;API 相關直達 &#x1f388;-------------------------- &#x1f680;Gradio: 實用篇 | 關于Gradio快速構建人工智能模型實現界面&#xff0c;你想知道的都在這里-CSDN博客 &#x1f680;Streamlit :實用篇 | 一文快速構建人工智能前端展…

Activity從下往上彈出視差效果實現

其實這篇文章是轉至簡書上的大佬的&#xff0c;加上我自己的代碼實踐了下發現可行&#xff0c;于是就分享下 先看效果 介紹: 其實有很多方法都可以實現這種效果&#xff0c;popwindow&#xff0c;Dialog&#xff0c;BottomSheetDialogFragment&#xff0c;BottomSheetDialog等…

Linux 安裝 Gitea.md

### 從官網下載git 和 gitea Git下載地址: https://mirrors.edge.kernel.org/pub/software/scm/git/ 下載 git-2.43.0.tar.gz: https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.43.0.tar.gz Gitea下載地址: https://dl.gitea.com/gitea/ 下載 linux-arm64 的二進…