Django的缓存

Posted knighterrant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django的缓存相关的知识,希望对你有一定的参考价值。

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,

最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,

则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

Django中提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

 

djangoMemcache缓存分为3种形式:

需要安装: pip install python_memcached 模块

  1.  通过中间键实现(实现全栈缓存)。  process_request,  process_response

1.settings.py 配置

MIDDLEWARE = [
    ‘django.middleware.cache.UpdateCacheMiddleware‘,   # 这两个中间键不能位置必须放在一首,一尾,update 在上
    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‘,
]

........


CACHES = {
    ‘default‘: {
        ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘,
        ‘TIMEOUT‘: 5,
        ‘LOCATION‘: [(‘192.168.11.81:12000‘,1),]
    }
}


CACHE_MIDDLEWARE_SECONDS = 5  # 设置缓存时间

 

2.总路由中url.py:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r‘^index/‘, views.index),
   
]

3.视图中: views.py  

from django.shortcuts import render,HttpResponse
import time

def index(request):

    ctime = time.time()

    return render(request,index.html,{ctime: ctime})

4. 模板中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>{{ ctime }}</h3>    
</body>
</html>

通过以上配置就能实现全站缓存。

 

  2.对单个视图 (对单页面做缓存)  , 使用 装饰器。@cache_page

1.settings.py 配置

# 配置  
CACHES = { default: { BACKEND: django.core.cache.backends.memcached.MemcachedCache,LOCATION: [(192.168.11.81:12000,1),] } }

如果需要其他设置:

技术图片

存入memcached 的数据格式:

技术图片

 

2.总路由中url.py:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r‘^index/‘, views.index),
   
]

3.视图中: views.py  

from django.shortcuts import render,HttpResponse
import time
 from django.views.decorators.cache import cache_page

@cache_page(5)
def index(request):

    ctime = time.time()

    return render(request,index.html,{ctime: ctime})

4. 模板中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>{{ ctime }}</h3>    </body>
</html>

页面效果是每5秒钟更新一次数据。

  3. 页面局部缓存(模板中的应用)

 1.配置中settings.py

CACHES = {
    default: {
        BACKEND: django.core.cache.backends.memcached.MemcachedCache,
        TIMEOUT: 5,
        LOCATION: [(192.168.11.81:12000,1),]
    }
}

2.总路由中url.py:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r‘^index/‘, views.index),
   
]

3.视图中: views.py  

from django.shortcuts import render,HttpResponse
import time

def index(request):

    ctime = time.time()

    return render(request,index.html,{ctime: ctime})

4.  模板html中

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>{{ ctime }}</h3>
    {% cache 5 "kkkkkkkk" %}
            <h3>{{ ctime }}</h3>
    {% endcache %}

</body>
</html>

 参数代表的含义:

技术图片

 

 扩展:以后可以自己写装饰器,实现单页面的缓存。

在视图中:

# 缓存装饰器
def
cache(func): def inner(request,*args,**kwargs): # 这可以打开文件或数据,看看数据库中是否有该值,有就从文件中读取并直接返回 res = func(request,*args,**kwargs) # 这可以 把数据把数据写入文件,或数据库 return res return inner

 

 扩展内容:

http://www.cnblogs.com/wupeiqi/articles/5246483.html

 

以上是关于Django的缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django Summernote 中显示编程片段的代码块?

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题