Django_緩存

目錄

Django緩存的介紹html

配置(settings.py設置不一樣緩存介質)python

應用(全局、視圖函數、模板)web

實測redis

Django緩存的介紹

除了Django這個web框架以外、其餘框架都沒有緩存。Django的配置一下就可使用。數據庫

Django中提供了5種緩存方式:django

    • 開發調試(緩存哪裏都不放,只都配置好,測試用)
    • 內存
    • 文件
    • 數據庫
    • Memcache緩存 
      • (使用 python-memcached模塊 鏈接memcache)
      • (使用 pylibmc模塊 鏈接memcache)

配置(settings.py設置不一樣緩存介質)

官網:https://docs.djangoproject.com/en/1.9/topics/cache/windows

http://docs.30c.org/djangobook2/chapter15/後端

開發調試

# 此爲開始調試用,實際內部不作任何操做
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',     # 引擎
                'TIMEOUT': 300,           # 緩存超時時間(默認300,None表示永不過時,0表示當即過時)
                'OPTIONS':{
                    'MAX_ENTRIES': 300,   # 最大緩存個數(默認300)
                    'CULL_FREQUENCY': 3,  # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認剔除1/3)
                },
                'KEY_PREFIX': '',         # 緩存key的前綴(默認空)
                'VERSION': 1,             # 緩存key的版本(默認1)
                'KEY_FUNCTION' 函數名     # 生成key的函數(默認函數會生成爲:【前綴:版本:key】)
            }
        }

    # 自定義key 名
    def default_key_func(key, key_prefix, version):
        """
        Default function to generate keys.

        Constructs the key used by all other methods. By default it prepends
        the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
        function with custom key making behavior.
        """
        return '%s:%s:%s' % (key_prefix, version, key)

    def get_key_func(key_func):
        """
        Function to decide which key function to use.

        Defaults to ``default_key_func``.
        """
        if key_func is not None:
            if callable(key_func):
                return key_func
            else:
                return import_string(key_func)
        return default_key_func
開發調試

內存

# 此緩存將內容保存至內存的變量中
      # 配置:
          CACHES = {
              'default': {
                  'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
                  'LOCATION': 'unique-snowflake',
              }
          }

      # 注:其餘配置同開發調試版本
內存

文件

# 此緩存將內容保存至文件
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                'LOCATION': '/var/tmp/django_cache',
                # 'LOCATION': os.path.join(BASE_DIR,'cache'),
            }
        }
    # 注:其餘配置同開發調試版本
文件

數據庫

# 此緩存將內容保存至數據庫
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
                'LOCATION': 'my_cache_table', # 數據庫表
            }
        }
    # 注:執行建立表命令 python manage.py createcachetable
數據庫

Memcache(python-memcached模塊)

# 此緩存使用python-memcached模塊鏈接memcache
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }
    CACHES = {  # 鏈接本地cookie
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': 'unix:/tmp/memcached.sock',
        }
    }   
    # 能夠配置多個,鏈接多個memcache
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
                # ('172.19.26.240:11211',10)  調權重
                # ('172.19.26.242:11211',11)  調權重,memcache模塊實現的
            ]
        }
    }
Memcache(python-memcached模塊)

Memcache緩存(pylibmc模塊)

# 此緩存使用pylibmc模塊鏈接memcache
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '/tmp/memcached.sock',
        }
    }   
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
            ]
        }
    }
Memcache緩存(pylibmc模塊)

注意:以上配置都可CACHES中同時配置,只需配置不同的名字便可緩存

 

CACHES = {
    'default': {
      'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
      'LOCATION': 'unique-snowflake',
    },
    'file': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        # 'LOCATION': '/var/tmp/django_cache',  # 這個是文件夾的路徑
        'LOCATION': r'D:\Python相關\過程project\django複習\first_review\testcaches\caches_files',#windows下的示例
    }
}

CACHE_MIDDLEWARE_ALIAS = "file"  # 只需設置使用的別名的便可
CACHES下多個配置

 

 補充:rediscookie

 pip install django-redis  
  apt-get install redis-server

  而後在settings.py 裏面添加CACHES = {
  'default': {
  'BACKEND': 'redis_cache.cache.RedisCache',
  'LOCATION': '127.0.0.1:6379',
  "OPTIONS": {
  "CLIENT_CLASS": "redis_cache.client.DefaultClient",
  },
  }

 

 

應用(全局、視圖函數、模板)

 @cache_page(15) #超時時間爲15秒,這15秒是暫存的狀態,當過了15秒又是新狀態了

全局

"""
'django.middleware.cache.UpdateMiddleware',
 服務端響應response時做用 查看是否有緩存,若是沒有則寫入緩存,不然直接返回給客戶端

'django.middleware.cache.FetchFormCacheMiddleware',
客戶端請求request時做用 查看是否有緩存,若是有不通過views直接返回,不然進入views視圖執行函數獲取緩存

 客戶端第一次發出請求是一般是沒有緩存的,
 所以request請求由中間件FetchForm通過檢查沒有緩存後進入views
 而後response攜帶緩存到中間件Update後寫入緩存,再返回給客戶端
"""


# 使用中間件,通過一系列的認證等操做,
# 若是內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶,
# 當返回給用戶以前,判斷緩存中是否已經存在,
# 若是不存在則UpdateCacheMiddleware會將緩存保存至緩存,從而實現全站緩存
    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',  # 只有process_response
        # 其餘中間件...
        'django.middleware.cache.FetchFromCacheMiddleware',  # 只有process_view
    ]


    CACHE_MIDDLEWARE_ALIAS = 'default'    #用來存儲的緩存別名,多CACHES配置了多個緩存配置,則用此配置進行設置
    CACHE_MIDDLEWARE_SECONDS = 0  #全部頁面默認緩存時間,默認600
    CACHE_MIDDLEWARE_KEY_PREFIX ='www.demo.com'  #關鍵的前綴,當多個站點使用同一個配置的時候,這個能夠設置能夠避免發生衝突,通常設置爲網站域名
    CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #那麼只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的作法,注意確保已經啓用了Django用戶認證中間件
全局

單獨視圖緩存(views函數緩存)

cache_page只接受一個參數和兩個關鍵字參數
注意:cache_page裝飾器的方式,即便沒有設置緩存中間件,只要設置的緩存方式,也同樣能夠緩存
timeout是緩存時間,以秒爲單位
cache:指定使用你的CACHES設置中的哪個緩存後端
key_prefix:指定緩存前綴,能夠覆蓋在配置文件中CACHE_MIDDLEWARE_KEY_PREFIX的
參數說明
方式一 FBV
    from django.views.decorators.cache import cache_page

    @cache_page(60 * 15)
    def my_view(request):
        ...

方法二 CBV
    from django.views.decorators.cache import cache_page
    from django.utils.decorators import method_decorator
    from django.views import View
    
    class Index(View):
        @method_decorator(cache_page(5))
        def get(self,request):
            ....
        
方式三:
    from django.views.decorators.cache import cache_page

    urlpatterns = [
        url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
        ]
單獨視圖緩存

局部視圖緩存(模版局部緩存)

a. 引入TemplateTag

        {% load cache %}

b. 使用緩存

        {% cache 5000 緩存key %}  //單位秒
            緩存內容
        {% endcache %}
局部視圖緩存

實測

全局

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': os.path.join(BASE_DIR,'cache'),
    }
}
# CACHE_MIDDLEWARE_ALIAS = ""
CACHE_MIDDLEWARE_SECONDS = 5
# CACHE_MIDDLEWARE_KEY_PREFIX = ""
settings.py
from django.shortcuts import render,HttpResponse
import time
from django.views.decorators.cache import cache_page

# @cache_page(60 * 15)  # 15分鐘:60秒 * 15
# @cache_page(5)  # 5秒
# def index(request):
#     ctime = time.time()
#     print(ctime)
#     return render(request,"index1.html",{"ctime":ctime})


def index(request):
    ctime = time.time()
    print(ctime)
    return render(request,"index1.html",{"ctime":ctime})
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>{{ ctime }}</h2>
</body>
</html>
index1.html

單獨視圖緩存(文件緩存)

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': os.path.join(BASE_DIR,'cache'),  # 新建文件夾 cache
    }
}
settings.py
from django.shortcuts import render,HttpResponse
import time
from django.views.decorators.cache import cache_page


# @cache_page(60 * 15)  # 15分鐘:60秒 * 15
@cache_page(5)  # 5秒
def index(request):
    ctime = time.time()
    print(ctime)
    return render(request,"index1.html",{"ctime":ctime})
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>{{ ctime }}</h2>
</body>
</html>
index1.html

cache文件夾多了一些緩存數據

局部視圖緩存(文件緩存)

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': os.path.join(BASE_DIR,'cache'),
    }
}
settings.py
from django.shortcuts import render,HttpResponse
import time
from django.views.decorators.cache import cache_page

# @cache_page(60 * 15)  # 15分鐘:60秒 * 15
# @cache_page(5)  # 5秒
# def index(request):
#     ctime = time.time()
#     print(ctime)
#     return render(request,"index1.html",{"ctime":ctime})


def index(request):
    ctime = time.time()
    print(ctime)
    return render(request,"index2.html",{"ctime":ctime})
views.py
{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>{{ ctime }}</h3>
    {% cache 5 "kkk" %}
        <h3>{{ ctime }}</h3>
    {% endcache %}
</body>
</html>
index2.html

 使用Memcache緩存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '1.1.1.39:12000',
        "TIMEOUT":5,
    }
}
# CACHE_MIDDLEWARE_ALIAS = ""
CACHE_MIDDLEWARE_SECONDS = 5
# CACHE_MIDDLEWARE_KEY_PREFIX = ""
settings.py

實測有效。

 

參考or轉發

https://blog.csdn.net/fgf00/article/details/54319791

相關文章
相關標籤/搜索