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.mzph.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 的二进…