Django4中的快取
詳細文件參考:https://www.cnblogs.com/Neeo/articles/17589834.html
Django支援的快取有好幾種:
- 三方的Redis(推薦),Memcached(不推薦)
- 快取到本地檔案
- 快取到本地資料庫
- 快取到記憶體裡
- 虛擬快取
快取的粒度
區域性檢視快取
快取指定的檢視函式,有兩種寫法.
- 在檢視中以裝飾器的形式
views.py
import datetime
from django.shortcuts import render, HttpResponse
# 必須匯入快取裝飾器
from django.views.decorators.cache import cache_page
@cache_page(5) # 快取單位:秒
def index(request):
# print(1111)
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return render(request, 'index.html', {"now": now})
urls.py
:
from django.contrib import admin
from django.urls import path
from api import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
- 在路由中實現
views.py
import datetime
from django.shortcuts import render, HttpResponse
def index(request):
# print(1111)
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return render(request, 'index.html', {"now": now})
urls.py
from django.contrib import admin
from django.urls import path
from api import views
from django.views.decorators.cache import cache_page
urlpatterns = [
path('admin/', admin.site.urls),
# path('index/', views.index),
path('index/', cache_page(5)(views.index)), # 快取,路由中指定快取的檢視函式
]
模板快取,粒度更新,相當於對於頁面的區域性進行快取
views.py中正常寫程式碼:
import datetime
from django.shortcuts import render, HttpResponse
# 必須匯入快取裝飾器
# from django.views.decorators.cache import cache_page
#
#
# @cache_page(5) # 快取單位:秒
def index(request):
# print(1111)
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return render(request, 'index.html', {"now": now})
urls.py正常寫程式碼:
from django.contrib import admin
from django.urls import path
from api import views
# from django.views.decorators.cache import cache_page
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
# path('index/', cache_page(5)(views.index)), # 快取,路由中指定快取的檢視函式
]
index.html這裡就需要注意了。
- 必須load cache
- 必須用快取的模板把要快取的內容包起來,才能被快取上,其它沒包裹的標籤,不快取。
{% load cache %} <!-- 必須宣告 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>沒有快取的</h3>
<p>{{ now }}</p>
<h3>有快取的</h3>
<!-- cache 後面的5,表示快取的時間,5後面的字串來自於settings.py中的快取配置中的LOCATION的值'unique-snowflake'-->
<!-- 用快取的模板把要快取的內容包起來-->
{% cache 5 'unique-snowflake' %}
<p>{{ now }}</p>
<p>{{ now }}</p>
{% endcache %}
</body>
</html>
全棧快取
就是整個專案進行快取,粒度是最大的。
首先要配置settings.py
MIDDLEWARE = [
# 下面這個快取中介軟體必須放在所有中介軟體的最上面
"django.middleware.cache.UpdateCacheMiddleware",
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 下面這個快取中介軟體必須放在所有中介軟體的最下面
"django.middleware.cache.FetchFromCacheMiddleware",
]
# 我這裡將cache快取由本地記憶體快取更換為了Redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://:@127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "1234", # 密碼,如果沒有設定密碼,這個引數可以注視掉
# 'MAX_ENTRIES': 300, # 最大快取個數(預設300)
# 'CULL_FREQUENCY': 3, # 快取到達最大個數之後,剔除快取個數的比例,即:1/CULL_FREQUENCY(預設3)
}
}
}
# 預設超時時間是300秒,我們可以透過CACHE_MIDDLEWARE_SECONDS來修改
CACHE_MIDDLEWARE_SECONDS = 20
# 下面是關於key的,咱們這裡保持預設就完了
CACHE_MIDDLEWARE_KEY_PREFIX = ""
# 用於儲存的快取別名,沒想好的,指定個default就行
CACHE_MIDDLEWARE_ALIAS = "default"
views.py
正常寫程式碼:
import datetime
from django.shortcuts import render, HttpResponse
# 必須匯入快取裝飾器
# from django.views.decorators.cache import cache_page
#
#
# @cache_page(5) # 快取單位:秒
def index(request):
# print(1111)
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return render(request, 'index.html', {"now": now})
urls.py
正常寫程式碼:
from django.contrib import admin
from django.urls import path
from api import views
# from django.views.decorators.cache import cache_page
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
# path('index/', cache_page(5)(views.index)), # 快取,路由中指定快取的檢視函式
]
index.html也正常寫程式碼:
{% load cache %} <!-- 必須宣告 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>沒有快取的</h3>
<p>{{ now }}</p>
<h3>有快取的</h3>
{% cache 5 'unique-snowflake' %}
<p>{{ now }}</p>
<p>{{ now }}</p>
{% endcache %}
</body>
</html>
注意,如果同時使用了全棧快取和區域性模板片段快取,那麼全棧快取的優先順序高。
Redis
資料庫排行榜:https://db-engines.com/en/ranking
redis是一個獨立的非關係型資料。
官方建議,將Redis安裝到Linux系統,所以,你在redis官網,壓根看不到redis關於Windows的安裝包。
redis3 for Windows
參考:https://www.cnblogs.com/Neeo/articles/12673194.html#windows
和講解影片
redis3 for centos
參考:https://www.cnblogs.com/Neeo/articles/12673194.html#redis307-for-centos79
和講解影片
注意,必須關閉你的centos系統的防火牆:
# 檢視防火牆狀態
systemctl status firewalld.service
# 關閉防火牆
systemctl stop firewalld.service
# 禁止開機啟動防火牆
systemctl disable firewalld.service
# 啟動防火牆
systemctl start firewalld.service
# 防火牆隨系統開啟啟動
systemctl enable firewalld.service
# 關閉selinux
[root@r ~]# sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
關於Redis使用和python如何操作
參考我的部落格:https://www.cnblogs.com/Neeo/p/10864123.html#database
關於Django如何操作Redis?參考:https://www.cnblogs.com/Neeo/articles/14269422.html