以下学习 朔宁夫 开发工程师 课程。
缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。
一 缓存
1. 数据库缓存
创建缓存数据表 //
python manage.py createcachetable cache_table
setting //
# 缓存配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 数据库缓存 声明此时django项目使用数据库缓存方式进行缓存 'LOCATION': 'cache_table' # 指定数据库缓存表的名称 } }
创建新的演示 app //
python manage.py startapp cache_app
setting注册、项目链接总路由、app创建子路由。
path('cache/',include('cache_app.urls', namespace="cache")),
views //
import time
from django.core.cache import caches
from django.http import HttpResponse
from django.shortcuts import render
def db_show(request):
# 实例化缓存对象
db_cache = caches["default"]
# 判断缓存师傅存在
cache_data = db_cache.get("data_cache") # 缓存的数据
if cache_data:
print("命中缓存")
return HttpResponse(cache_data)
print("没有命中,开始查找······")
time.sleep(10)
data = ['new algorithm', 'new application', 'combining models', 'data mining']
response = render(request, "advance.html", {"data": data})
# 设置缓存
db_cache.set("data_cache", response.content, timeout=30)
return response
sub route//
app_name = "cache" urlpatterns = [ path('db/', db_show), ]
advance.html //
<ul> {% for i in data %} <li>{{ i }}</li> {% endfor %} </ul>
2. Redis缓存
# 安装依赖 # pip install django-redis # pip install django-redis-cache
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
or
Releases · tporadowski/redis · GitHub
Windows下安装Redis7.0.8_redis7.0.8解压版安装-CSDN博客
最终找资源安装了github上的7+需编译版。安装完成后
1) “服务” 启动 get readyxxx,redis 2项
2)管理员cmd cd /d D:\mysql\redis , redis-server.exe redis.conf ,
3)管理员cmd cd /d D:\mysql\redis , redis-cli.exe -h 127.0.0.1 -p 6379 , set a 1 , get a
4)django terminal D:\mysql\redis> .\redis-cli.exe , ping , select 15 , keys *。可见我的15号库是空的。
setting //
CACHES = {
# 数据库缓存
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
# 数据库缓存 声明此时django项目使用数据库缓存方式进行缓存
'LOCATION': 'cache_table'
# 指定数据库缓存表的名称
},
# Redis 缓存 (Redis有[0,15]个库select k, 默认0对应6379)
# 安装依赖
# pip install django-redis
# pip install django-redis-cache
'redis_cache': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/2', # 设置为本机 2号库
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient'
}
}
}
views //
def redis_show(request):
# 实例化缓存对象
redis_cache = caches["redis_cache"]
# 判断缓存师傅存在
cache_data = redis_cache.get("data_cache") # 缓存的数据
if cache_data:
print("命中缓存")
return HttpResponse(cache_data)
print("没有命中,开始查找······")
time.sleep(10)
data = ['new algorithm', 'new application', 'combining models', 'data mining']
response = render(request, "advance.html", {"data": data})
# 设置缓存
redis_cache.set("data_cache", response.content, timeout=30)
return response
访问页面,未过期时终端可见2号库中数据
3. memcached缓存
# memcached # 一个单独的服务系统,有自己的端口号 # pip install python-memcached 'mem_cached': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCach', # 指定缓存使用的引擎 'LOCATION': '127.0.0.1:11211' }
4. 程序层缓存
django中使用最多的一种方式
① 用装饰器
views //
@cache_page(30) # 先看有没有缓存,再绝对是否调用函数 def show(request): print('无系统缓存,执行对本函数的调用') data = ['new algorithm', 'new application', 'combining models', 'data mining'] return render(request, "advance.html", {"data": data})
②放到urls中使用
url //
path('pro_url/', cache_page(30)(url_show))
views //
def url_show(request): print('无系统缓存,执行对本函数的调用') data = ['new algorithm', 'new application', 'combining models', 'data mining'] return render(request, "advance.html", {"data": data})
二 中间件
中间件本质上是一个类。AOP思想。aspect oriented programming, 面向切面编程。AOP&OOP。实现:注册+添加方法。
需要复写的方法(自定义的middleware类中添加相关执行时机的方法):1)process_request(self,request)请求预处理方法;2)process(self, request, view, args, kwargs) View预处理方法;3)process_response(self, request, response)Response后处理方法;4)process_exception(self, request, exception) Exception后处理方法。
演示:
项目层new python package my_middleware
package下new my_middleware.py //
from urllib import response
from django.utils.deprecation import MiddlewareMixin
class MyFirstMiddleWare(MiddlewareMixin):
def process_request(self, request):
print("1--process_request")
def process_view(self, request, view, args, kwargs):
print("2--process_view")
def process_response(self, request, response):
print("3--precess_response")
return response
class MySecondMiddleWare(MiddlewareMixin):
def process_request(self, request):
print("21--process_request")
def process_view(self, request, view, args, kwargs):
print("22--process_view")
def process_response(self, request, response):
print("23--precess_response")
return response
注册 setting 注意列表元素有序,遍历先后问题//
MIDDLEWARE = [xxx,
'my_middleware.my_middleware.MyFirstMiddleWare',
'my_middleware.my_middleware.MySecondMiddleWare',]
访问某个页面 //
# 从前往后遍历中间件,但response从后往前