Django中的缓存

作者:编程技术
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))

2.1.4 数据库缓存(把缓存数据存款和储蓄在数据库中)

settings.py文件配置

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是Django原生补助的缓存系统.要动用Memcached,要求下载Memcached的支撑库python-memcached或pylibmc.

一、Django缓存

2.1.2 内部存款和储蓄器缓存(将缓存内容保留至内部存款和储蓄器区域中)

settings.py文件配置

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)
        }      
    }
}

1.3.3 局地视图缓存

2.1.5 Memcache缓存(使用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',
]

其他代码不变,刷新浏览器是10秒,页面上的时刻转移一次,这样就完结了全站缓存.

2.1.6 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',
]

Memcached是基于内存的缓存,数据存款和储蓄在内部存款和储蓄器中.所以假若服务器死机的话,数据就能够扬弃,所以Memcached诚如与此外缓存合营使用

模板(index.html):

2.1.1 开采调节和测量检验(此方式为开支调节和测量检验使用,实际上不推行此外操作)

settings.py文件配置

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)
        },
    }
}

当再次回到给顾客在此之前,剖断缓存中是否业已存在,假诺不设有,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以达成全站缓存

2.Django提供了6种缓存格局

  • 支出调节和测验缓存
  • 内部存储器缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)

平时使用的有文件缓存和Mencache缓存

地点的事例是依据内部存储器的缓存配置,基于文件的缓存该怎么安排呢??

3.Django中的缓存应用

Django提供了差别粒度的缓存,能够缓存有些页面,能够只缓存三个页面包车型大巴某些部分,以致可以缓存整个网址.

1.3.2 全站选拔缓存

3.2 全站利用缓存

既是是全站缓存,当然要接纳Django中的中级件.

顾客的倡议通过中间件,经过一文山会海的注解等操作,即使央求的剧情在缓存中留存,则动用FetchFromCacheMiddleware获取内容并赶回给客户

当重临给客商在此之前,剖断缓存中是否已经存在,固然荒诞不经,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以完结全站缓存

修正settings.py配置文件

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',            #响应HttpResponse中设置几个headers
    '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',         #用来缓存通过GET和HEAD方法获取的状态码为200的响应
]

CACHE__MIDDLEWARE_SECONDS=15                                    # 设定超时时间为15秒

views视图函数

from django.shortcuts import render
import time

def index(request):
    ctime = time.time()
    return render(request,'index.html',{'ctime':ctime})

别的代码不变,刷新浏览器是15秒,页面上的年华变化一遍,这样就得以达成了全站缓存.

模板:

3.1 单独视图缓存

事例,为单个视图函数增多缓存

路由配置:

url(r'^index$',views.index),

数据库

图片 1

views代码:

from app01 import  models
from django.views.decorators.cache import cache_page
import time

@cache_page(15)                                 #超时时间为15秒
def index(request):
    user_list=models.UserInfo.objects.all()     #从数据库中取出所有的用户对象
    ctime=time.time()                           #获取当前时间
    return render(request,"index.html",{"user_list":user_list,"ctime":ctime})

index.html代码:

body>
<h1>{{ ctime }}</h1>
<ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
</ul>
</body>

因为缓存的缘由,不停的根基代谢浏览器时会开采,页面上显得的命宫每15分钟变化叁遍.

在马上刷新浏览器的时候,马上在数据库中增加三个客户对象,这时候持续刷新浏览器,前端页面上不交易会示刚才增添的客户

间接刷新浏览器15秒后,新增添长的客商才用在前面一个页面上显得出来.

上边的事例是依照内部存款和储蓄器的缓存配置,基于文件的缓存该怎么陈设呢??

更改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)
        }
    }
}

接下来再度刷新浏览器,能够见到在刚刚安排的目录下转移的缓存文件

图片 2

经超过实际验可以明白,Django会以投机的花样把缓存文件保留在配备文件中钦命的目录中.

views视图函数

1.缓存的简单介绍

在动态网址中,客商具备的乞求,服务器都会去数据库中开展对应的增,删,查,改,渲染模板,实践专门的学业逻辑,最终身成客商见到的页面.

当贰个网址的客商访问量极大的时候,每叁次的的后台操作,都会成本过多的服务端财富,所以必得采用缓存来减轻后端服务器的压力.

缓存是将有个别常用的数目保存内部存款和储蓄器依然memcache中,在早晚的时刻内有人来拜望这一个数据时,则不再去实行数据库及渲染等操作,而是径直从内存或memcache的缓存中去获得数据,然后回到给客户.

客商的伸手通过中间件,经过生机勃勃多种的印证等操作,假设央求的剧情在缓存中设有,则动用FetchFromCacheMiddleware获取内容并再次回到给客商

2.1 各个缓存情势的陈设文件注明

数据库:

2.1.3 文件缓存(把缓存数据存款和储蓄在文书中)

settings.py文件配置

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)
        }
    }           
}

模板(index.html):

3.3 局部视图缓存

事例,刷新页面时,整个网页有部分得以完毕缓存

views视图函数

from django.shortcuts import render
import time

def index(request):
    # user_list = models.UserInfo.objects.all()
    ctime = time.time()
    return render(request,'index.html',{'ctime':ctime})     

前面二个网页

{% load cache %}                # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ ctime }}</h1>
{% cache 15 'aaa' %}            # 设定超时时间为15秒
    <h1>{{ ctime }}</h1>
{% endcache %}
</body>
</html>

刷新浏览器能够看来,第二个时间实时变化,前边二个时光每15分钟变化一遍

修正settings.py配置文件

更改settings.py的配置

既然是全站缓存,当然要利用Django中的中档件.

通过试验可见,Django会以本身的款型把缓存文件保留在安插文件中内定的目录中.

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())
{% 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> 
缓存整个站点,是最简单的缓存方法

在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件
MIDDLEWARE_CLASSES = (
    ‘django.middleware.cache.UpdateCacheMiddleware’, #第一
    'django.middleware.common.CommonMiddleware',
    ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后
)
“update” 必须配置在第一个
“fetch” 必须配置在最后一个

 

<!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>

视图函数:

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)
  }
 }
}

然后重新刷新浏览器,能够看出在刚刚布局的目录下转移的缓存文件

视图:

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

Django提供了差别粒度的缓存,可以缓存有些页面,可以只缓存一个页面包车型大巴某部部分,以至能够缓存整个网址.

<!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>

setting

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

图片 3图片 4

事例,刷新页面时,整个网页有部分兑现缓存

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())

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 Python学习 缓存 Django Django学习笔记