Django 支持的缓存类型
- 内存(local-memory caching)- 文件(FileSystem caching)- 数据库(Database caching)- Memcache缓存系统(有python-memcached和pylibmc两种方式)- 伪缓存(Dummy caching 用于开发模式)- 自定义缓存(Customer caching)
django 缓存类型的配置
- 在django的settings.py下配置缓存类型
local-memory caching配置
CACHES={
'default':{
'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
#给放置缓存的内存区设置一个名字
'LOCATION':'loach-blog',
}
}
FileSystem caching配置
CACHES={
'default':{
#让系统知道我们将缓存存储在文件缓存系统中的区域
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
#指定缓存存储的文件夹,
#windows
'LOCATION':'d:/tmp/django_cache',
#linux
#'LOCATION':'/var/tmp/django_cache'
}
}
注意事项
* 目录的路径必须为绝对路径,确保系统能够对缓存的目录有访问权限。
* 目录的路径结尾处"/"可有可无
* 确保目录存在,且web服务器的用户对该目录具有读写权限
* 注意配置的大小写(Linux)
Database caching配置
CACHES={
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
#数据库中的缓存表名
'LOCATION':'my_cache_table',
}
}
Memcached caching python-memcached版配置
CACHES={
'default':{
'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
#数据库中的缓存表名
'LOCATION':'127.0.0.1:11211',
}
}
Memcached caching python-pylibmc版配置
CACHES={
'default':{
'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
#数据库中的缓存表名
'LOCATION':'127.0.0.1:11211',
}
}
Dummy caching 配置
CACHES={
'default':{
'BACKEND':'django.core.cache.backends.dummy.DummyCache',
}
}
Customer caching 配置
CACHES={
'default':{
'BACKEND':'path.to.backend',
}
}
缓存参数
- 每个缓存后端提供额外的参数来控制缓存的行为。- CACHES下参数列表 |参数名|描述 |------ |TIMEOUT|用于缓存的默认时间(秒为单位)。默认为300秒(5分钟),None永不过期,0为立即过期(即不缓存)。 |VERSION|缓存键的默认版本号 |KEY_FUNCTION|生成最终缓存 keys 的函数路径 |OPTIONS|根据不同的缓存类型对应不同的参数
- locmem、filesystem以及database的backend中OPTIONS的参数如下: |参数名|描述 |------ |MAX_ENTRIES|删除旧值之前缓存中允许的最大条数,默认为300. |CULL_FREQUENCY|当缓存数目达到 MAX_ENTRIES 时,就会删除部分缓存,删除率为1/CULL_REQUENCY, 如果 CULL_FREQUENCY = 2 ,当达MAX_ENTRIES 时,就会删除一半数据。默认值:3
其他配置参数
|参数名|描述 |------ |CACHE_MIDDLEWARE_ALIAS = 'default'|用来存储的缓存别名 |CACHE_MIDDLEWARE_SECONDS = 0|所有页面默认缓存时间,默认600 |CACHE_MIDDLEWARE_KEY_PREFIX ='www.loachblog.com'|关键的前缀,当多个站点使用同一个配置的时候,这个可以设置可以避免发生冲突,一般设置为网站域名 |CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False|那么只有匿名的请求会被缓存,这是一个禁用缓存非匿名用户页面的最简单的做法,注意确保已经启用了Django用户认证中间件
django 启动缓存
- 使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存- 在settings.py 配置中间件
MIDDLEWARE = [
#缓存中间件,必须为第一个
'django.middleware.cache.UpdateCacheMiddleware',
#其他中间件
#缓存中间件,必须放在最后一个
'django.middleware.cache.FetchFromCacheMiddleware',
]
- 查看缓存文件
#配置好缓存类型, 并设置好缓存中间件后,运行django项目
python manage.py runserver
# 查看缓存目录,会发现已经生成了站点的缓存文件
FetchFromCacheMiddleware
- 会缓存 GET 和 HEAD 200 状态的 responses,而且这些 request 和 response 的headers 是允许的;同一个 URL request, 不同查询参数,他的 Responses 会被作为不同 page 分别缓存;这个中间件期待用具有相同 response headers 的 GET request 的response 进行响应,这样它就可以用缓存的 GET response 响应 HEAD request。
UpdateCacheMiddleware
- 此中间件会在每个 HttpResponse 中自动设置一些 headers:对于一个页面的新版本(未被缓存过)的请求,设置 Last-Modified header 为当前日期/时间;设置 Expires header 为当前时期/时间 + 定义的CACHE_MIDDLEWARE_SECONDS设置 Cache-Control header 的 max age 指令CACHE_MIDDLEWARE_SECONDS (max age是指缓存的内容将在多少秒后失效)
其他
- 如果 view 设置了自己的 cache 过期时间 (如:设置了 Cache-Control 的 max-age), 则页面的缓存过期时间会以 view 的过期时间为准。