🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 缓存 * 缓存数据就是为了保存需要计算资源的结果,这样的话就不必在下次重复消耗计算资源 * Django自带了一个健壮的缓存系统来保存动态页面,避免对于每次请求都重新计算 * Django提供了不同级别的缓存粒度,可以缓存特定视图的输出,可以仅仅缓存哪些很难生产出来的部分、或者可以缓存整个网站 ## 设置缓存 * 通过设置决定把数据缓存在哪里,是数据中,文件系统,还是内存中 * 通过设置settings文件的CACHES配置来实现 * 参数TIMEOUT:缓存的默认过期时间,以秒为单位,这个参数默认是300秒,即5翻照片那个;设置TIMEOUT为None表示永远不会过期,值设置成0造成缓存立即失效 ```text # 本地缓存 CACHES = { 'default':{ 'BACKEND':'django.core.cache.backends.locmem.LocMemCache', 'TIMEOUT':60, } } ``` * MemcachedCache ```text 缓存包:pip install python-memcached pip install pylibmc # 缓存 CACHES = { 'default':{ 'BACKEND':'django.core.cache.backends.loca.MemcachedCache', #'BACKEND':'django.core.backends.memcached.PyLibMCCache' 'TIMEOUT':60, 'LOCATION':'127.0.0.1:11211', } } 在此示例中,高速缓存通过在IP地址172.19.26.240和172.19.26.242上运行的Memcached实例共享,这两个实例都位于端口11211上: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } } ``` * 可以将cache存到redis中,默认采用1数据库,需要安装包并配置如下: ```text 安装包:pip install django-redis-cache # 缓存 CACHES = { 'default':{ 'BACKEND':'redis_cache.cache.RedisCache', #'BACKEND':'django.core.backends.memcached.PyLibMCCache' 'TIMEOUT':60, 'LOVATION':'localhost:6379', } } ``` * 连接redis,查看存储的数据 ```text 开启redis服务:net start reids 连接:redis-cli 切换数据库:select 1 查看键:keys * 查看值:get 键 ``` ![](https://box.kancloud.cn/2d430958c7b009a60ad3be897b2471ad_700x202.png) ## 单个view缓存 * django.views.decorators.cache定义了cache\_page装饰器,用于对视图的输出进行缓存 * 示例代码 ```text urls.py # 配置路由 urlpatterns = [ path('cache/<int:code>/',views.cache), ] views.py #创建视图 @cache_page(60 * 15) def cache(request,code): # return render(request,'html/cache.html') return HttpResponse("hello world") ``` * cache\_page:timeout参数,缓存超时,以秒为单位,上述实体,cache视图的结果将被缓存15分钟 * 视图缓存与URL无关,如果多个URL指向同一视图,每个URL将会分别缓存 ## 模板片段缓存 * 使用cache模板标签来缓存模板的一个片段 * 需要两个参数: * 缓存时间,以秒为单位 * 给缓存片段起的名称 * 示例: ```text {% load cache %} {% cache 500 hello %} hello world {% endcache %} ``` ## 底层的缓存api ```text views.py #缓存视图 from django.core.cache import cache from django.core.cache.utils import make_template_fragment_key def cachesettings(request): cache.set('name', 'angle', 60*30) print(cache.get('name')) # cache.delete('name') # cache.clear() return render(request,'html/test.html') urls.py #配置路由 url(r'^test/$',views.cachesettings) ``` ```text from django.core.cache import cache 设置:cache.set(键,值,有效时间) 获取:cache.get(键) 删除:cache.delete(键) 清空:cache.clear() 设置多个值:cache.set_many({'a':1,'b':2}) 获取多个值:cache.get_cache(['a','b','c']) 删除多个值:cache.delete_many(['a','b']) 递增:cache.incr('num') 递减:cache.decr('num') 关闭连接:cache.close() ```