(12)Django - 缓存机制

2019-03-14  本文已影响0人  libdream

缓存是将一个请求的响应内容保存到内存或者高速缓存系统(Memcache)中,若某个时间内再次发生同一个请求,则不再去执行请求响应过程,而直接从内存或高速缓存系统中获取该请求的响应内容返回给用户。
Django提供了5种不同的缓存方式:


若在项目中使用缓存机制,首先需要在配置文件settings.py中设置缓存的相关配置。每种缓存方式的配置如下:

Memcached配置
#BACKEND用于配置缓存引擎,LOCATION是Memcached服务器的IP地址
CACHES = {
    'default':{
        #使用python-memcached模块连接Memcached
        'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
        #使用pylibmc模块连接Memcached
        #'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION':[
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}
数据库缓存配置
#BACKEND用于配置缓存引擎,LOCATION用于数据表的命名
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        'LOCATION':'my_cache_table',
    }
}
文件系统缓存
#BACKEND用于配置缓存引擎,LOCATION是文件保存的路径
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION':'e:/mysite',
    }
}
本地内存缓存
#BACKEND用于配置缓存引擎,LOCATION对存储器命名,用于识别耽搁存储器
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION':'unique-snowflake',
    }
}
虚拟缓存
#BACKEND用于配置缓存引擎
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.dummy.DummyCache',
    }
}

上述缓存配置仅仅是基本配置,也就是说缓存参数BACKEND和LOCATION是必须配置的,其余的配置参数可自行选择。我们以数据库缓存配置为例,完整的缓存配置如下:

#BACKEND用于配置缓存引擎,LOCATION用于数据表的命名
CACHES = {
    'default':{
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        'LOCATION':'my_cache_table',
        #设置缓存的生命周期,以秒为单位,若为None,则永不过期
        'TIMEOUT': 60,
        'OPTIONS':{
            #MAX_ENTRIES代表最大缓存记录的数量
            'MAX_ENTRIES': 1000,
            #当缓存到达最大数量之后,设置剔除缓存的数量
            'CULL_FREQUENCY': 3,
        }
    },
    #设置多个缓存数据表
    'mysite':{
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        'LOCATION':'mysite_cache_table',
}

当配置完成数据库缓存配置后,下一步是在数据库中创建数据缓存表,缓存数据表的生成依赖于配置文件中DATABASES的配置信息,如果DATABASES配置了多个数据库,那么缓存数据表默认在DATABASES 的default的数据库中生成。在项目命令行下输入python manage.py createcachetable指令即可创建缓存数据表。

image.png

创建缓存数据表之后,就可以在项目中是哪个缓存了。缓存的使用方式有4种,主要根据使用对象的不同来划分,具体说明如下:

全站缓存

全站缓存作用于整个网站,当用户向网站发送请求时,首先经过Django的中间件进行处理。因此,使用全站缓存应在Django的中间件中配置,配置信息如下:

MIDDLEWARE = [
    #配置全站缓存
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    #使用中文
    'django.middleware.locale.LocaleMiddleware',
    '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',
]
#设置缓存的生命周期,若在缓存配置CACHES中设置TIMEOUT属性,则程序优先选择这里的设置
CACHE_MIDDLEWARE_SECONDS = 15
#设置缓存数据保存在数据表my_cache_table中,属性值default来自于缓存配置CACHES的default属性
CACHE_MIDDLEWARE_ALIAS = 'default'
#设置缓存表字段cache_key的值,用于同一个Django项目多个站点之间的共享缓存
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite'

启动mysite项目,在浏览器上访问的页面都会在缓存数据表my_cache_table上生成相应的缓存信息。


缓存数据表my_cache_table

视图缓存

视图缓存是将视图函数执行过程中生成缓存数据,主要以装饰器的形式来实现。装饰器有三个参数:timeout、cache和key_prefix,参数timeout是必选参数,其余两个是可选参数。

#index 的 views.py
from django.views.decorators.cache import cache_page
#参数cache与全站缓存CACHE_MIDDLEWARE_ALIAS相同
#参数key_prefix与全站缓存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(timeout=10, cache='mysite', key_prefix='mysiteView')
@login_required(login_url='/user/login.html')
def shoppingCarView(request):
    pass
    return render(request, 'shoppingCar.html', locals()) 

在浏览器上访问购物车页面,打开数据库查看数据缓存表mysite_cache_table的视图缓存信息,如下图:


image.png

路由缓存

路由缓存主要在路由配置urls.py中实现,路由缓存cache_page有三个参数,分别是timeout、cache和key_prefix,参数timeout是必选参数,其余两个参数是可选参数,参数的含义与视图缓存的参数一致。
代码如下:

#index的urls.py
from django.urls import path, re_path
from . import views
from django.views.decorators.cache import cache_page

urlpatterns = [
    path('', cache_page(timeout=10,cache='mysite',key_prefix='mysiteURL')(views.index), name='index'),
    path('shoppingCar.html', views.shoppingCarView, name='shoppingCar'),
]

在浏览器访问首页,打开数据库查看缓存数据表mysite_cache_table查看路由缓存信息。


image.png

模板缓存

模板缓存是通过Django的缓存标签实现的,缓存标签只支持两个参数:timeout和key_prefix,以index.html为例实现模板缓存,代码如下:

{# 设置缓存 #}
{% load cache %}
{% cache 10 mysiteTemp %}
<div>要缓存的内容</div>
{# 缓存结束 #}
{% endcache %}

模板缓存的缓存信息默认存储在数据表my_cache_table中,打开数据库查看数据表my_cache_table的模板缓存信息如下:


image.png
上一篇 下一篇

猜你喜欢

热点阅读