#数据缓存机制 CACHES = { 'default': { 'BACKEND':'django.core.cache.backends.db.DatabaseCache', #数据库引擎 'TIMEOUT':300, #缓存超时时间(默认300秒,None表示永不过期,0表示立即过期) 'LOCATION': 'my_cache_table', 'MAX_ENTRIES': 3, # 当前最大缓存数 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即 1/CULL_FREQUENCY(默认3) } }这里还有最红要的一步操作就是创建缓存数据表,使用如下命令:
python manage.py createcachetable my_cache_table
基于本教程中使用数据库进行缓存其实是非常鸡肋的,因为我们之所以使用缓存就是为了减少数据库的查询,但是企业环境下的数据库如果非常高速、高效,那么你可以使用这种机制,我们在这里简单讲解一下它的基本配置。大家注意各种缓存机制在 settings.py 文件的配置都是相差无几的。文件系统缓存的配置如下所示:#基于window CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': 'c:/foo/bar', #若是 Linux 路径写为 /home/cnet/cachetest } }文件缓存机制,也是 Django 为我们提供的一种执行缓存的方法,不过这种方法相较数据库而言更慢,不过有总比没有强,在你无路可走的时候,为了实现达到缓存的目的也可以使用。
# 此缓存将内容保存至内存的变量中 CACHES = { 'default':{ 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake',#给缓存放置的内存区设置一个名字 } }
from django.views.decorators.cache import cache_page @cache_page(60*30)#以秒为单位 def my_view(request): ...在 django.views.decorators.cache 定义了一个自动缓存视图响应结果的装饰器 cache_page,这个装饰器接受一个参数:timeout 以秒为单位。在上例中,my_view() 视图的结果将被缓存 30 分钟,也可以写为 60*30。在路由中使用缓存的格式如下:
from django.views.decorators.cache import cache_page ? urlpatterns = [ path('foo/', cache_page(60)(my_view)), ]在模板中也可以使用缓存,也叫模板碎片缓存,如下所示:
{% load cache %} {% cache 500 bar request.user.username %} .. bar for logged in user .. {% endcache %}我们要在模版的顶部位置添加 {% load cache %},同样它也需要 {% endcache %} 结尾。模板标签 {% cache %} 将在设定的时间内,缓存标签块中包含的内容。它最少需要两个参数:依次为缓存时间(以秒为单位)以及要被缓存的片段起的名称(bar)。
#在缓存有效时间内不会阻塞,直到缓存过期重新阻塞3秒 @cache_page(60) #缓存有效时间60s def test_cache(request): t1=time.time() #得到当前时间戳 time.sleep(3) #阻塞三秒 html='t1 is %s'%(t1) return HttpResponse(html)配置好路由映射关系,然后访问 127.0.0.1:8000/index/test_cache ,发现第一次请求时会阻塞三秒,然后再缓存期间请求页面则不需要阻塞,直到缓存过期重新阻塞。
from django.views.decorators.cache import cache_page path('test_cache/',cache_page(15)(views.test_cache))使用这种范式的时候,记得要把视图函数中的装饰器取消。
#视图函数 def test_time(request): if request.method=='GET': return render(request,'index/test_cache.html') elif request.method=='POST': t1 = time.time() # 得到当前时间戳 time.sleep(3) # 阻塞三秒 return render(request,'index/test_cache.html',locals())test_cache.html 模板页面如下所示:
<form action="/index/test_time/" method="post"> {% csrf_token %} {% load cache %} {% cache 30 test %} <p>我是缓存的 {{ t1 }}</p> {% endcache %} <h4> 我是没有缓存的{{ t1 }} </h4> <input type="submit" value="提交"> </form>配置好路由后,访问 127.0.0.1:8000/index/test_time,点击提交按钮后,你会发现有缓存的 t1 时间戳只有在 30s 以后才会改变,因为在这 30s 内它读取的都是已缓存模板片段内容。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有