缓存(cache),其做用是缓和较慢存储的高频次请求,简单来讲,就是加速满存储的访问效率。python
# 内存缓存:local-memory caching CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } } # 文件系统缓存:filessystem caching CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tem/django_cache', } }
这是Django推荐的缓存系统,也是分布式内存对象缓存系统(注意,它的分布式逻辑在客户端)。Django内置支持,集成度比较好。redis
安装:django
pip install python-memcached
配置settings.py缓存
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '127.0.0.1:8000', ] } } # 在MIDDLEWARE中加上, MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', ... 'django.middleware.cache.FetchFromCacheMiddleware', ]
在views.pyless
# 方法1: from django.views.decorators.cache import cache_page # 首页 60*15表示缓存15分钟 @cache_page(60*15) def index(request): pass # 方法2:直接在路由urls.py中实现 from django.views.decorators.cache import cache_page urlpatterns = [ path('index/', cache_page(60*15)(views.index)), ]
若是只想缓存某个字段的话分布式
from django.core.cache import cache def test(request): key = '我是缓存值' time= 60 result= cache.get(key) if not result: result = '' cache.set(key, result, time) return result
# 安装包 pip install django-redis==4.9.0 pip install hiredis==0.2.0
同时安装了hiredis,其做用是提高Redis解析性能。ide
在settings.py配置缓存memcached
REDIS_URL = '127.0.0.1:6379:1' CCACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': REDIS_URL, 'TIMEOUT': '300', 'OPTIONS': { # 'PASSWORD': '对应的密码', 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PARSER_CLASS': 'redis.connection.HiredisParser', }, 'CONNECTION_POOL_CLASS': 'redis.connection.BlockingConnectionPool', } }
# 直接在settings.py的MIDDLEWARE中的第一行增长 'django.middleware.cache.UpdateCacheMiddleware', # 但通常不这么用
缓存url函数
函数缓存的用法,只须要增长装饰器便可。好比:Model层的Post.hot_posts的更新频率不高,那么能够进行比较长的缓存。post
from django.core.cache import cache class Post(models.Model): @classmethod def hot_posts(self): result = cache.get('hot_posts') if not result: result = cls.objects.filter(status=cls.STATUS_NORMAL).order_by('-pv') cache.set('hot_posts', result, 10*60) return result
若是须要缓存部分的模板数据时。能够这么作,好比缓存50s。
{% load cache %}
{% cache 50 sidebar %}
...sidebar...
{% endcache %}
此时只须要把要缓存的内容用cache标签抱起来便可。