首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django配置缓存机制

Django配置缓存机制

作者头像
緣來
发布于 2018-09-18 09:18:16
发布于 2018-09-18 09:18:16
1.2K00
代码可运行
举报
文章被收录于专栏:緣來來來緣來來來
运行总次数:0
代码可运行

Django 官方关于cache的介绍:https://docs.djangoproject.com/en/dev/topics/cache/

Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。而使用缓存的话,可以将数据保存在缓存中,下次访问的时候直接从缓存中获得数据,而不用去请求后端数据库,这样服务器可以很快的响应请求,从而提高加载速度。

缓存系统工作原理:

对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容。

一般来说我们用 Django 来搭建一个网站,要用到数据库等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render
def index(request):
    # 读取数据库等 并渲染到网页
    # 数据库获取的结果保存到 queryset 中
    return render(request, 'index.html', {'queryset':queryset})

像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render
from django.views.decorators.cache import cache_page

@cache_page(60 * 15) # 秒数,这里指缓存 15 分钟,不直接写900是为了提高可读性
def index(request):
    # 读取数据库等 并渲染到网页
    return render(request, 'index.html', {'queryset':queryset})

当使用了cache后,访问情况变成了如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 访问一个网址时, 尝试从 cache 中找有没有缓存内容
# 如果网页在缓存中显示缓存内容,否则生成访问的页面,保存在缓存中以便下次使用,显示缓存的页面。
given a URL, try finding that page in the cache
if the page is in the cache:
    return the cached page
else:
    generate the page
    save the generated page in the cache (for next time)
    return the generated page

Django settings 中 cache 默认为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

也就是默认利用本地的内存来当缓存,速度很快。当然可能出来内存不够用的情况,其它的一些内建可用的 Backends 有

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'django.core.cache.backends.db.DatabaseCache'
'django.core.cache.backends.dummy.DummyCache'
'django.core.cache.backends.filebased.FileBasedCache'
'django.core.cache.backends.locmem.LocMemCache'
'django.core.cache.backends.memcached.MemcachedCache'
'django.core.cache.backends.memcached.PyLibMCCache'

在 github 上也有用 redis 做 Django的缓存系统的开源项目:https://github.com/niwibe/django-redis,有兴趣的可以看看哦!

下面我们就来介绍一下各种缓存的配置:

缓存配置

利用文件系统来缓存:

这个很简单,就是将数据缓存在指定的目录中。配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

利用数据库来缓存:

利用命令创建相应的表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ python manage.py createcachetable my_cache_table

配置如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

使用Memcache来缓存:

Memcached 是目前 Django 可用的最快的缓存,

但是memcache需要你的服务器支持,也就是说需要有Memcache服务,

Linux系统安装Memcached,首先要先安装libevent库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo apt-get install libevent ibevent-dev         自动下载安装(Ubuntu/Debian)

$ yum install libevent libevent-devel                    自动下载安装(Redhat/Fedora/Centos)

接着使用命令安装Memcache服务:

Ubuntu/Debian

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo apt-get install memcached

Redhat/Fedora/Centos

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ yum install memcached

然后需要pip安装Memcached的插件Python-mencached和pylibmc

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pip install Python-mencached
$ pip install pylibmc

最后在setting.py配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

使用Local-memory来缓存:

这种缓存方式会将数据保存在服务器的内存中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

最推荐的缓存方式是Memcache或者Local-memory,要不就是文件缓存,最不推荐的是数据库缓存

下面用一些实例来说明如何使用 Django 缓存系统

使用 Django 缓存系统

全站缓存

这种方式最简单最容易配置了,就是将你全站都做缓存,所有的页面都会缓存下来,配置方式: 在setting.pyMIDDLEWARE中添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
]

也就是将django.middleware.cache.UpdateCacheMiddlewaredjango.middleware.cache.FetchFromCacheMiddleware分别添加在django.middleware.common.CommonMiddleware的前面和后面,注意,顺序不能反过来。 这种方式清除缓存的话使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.core.cache import cache
cache.clear()

视图缓存

这种方式会指定要缓存的视图,只会缓存这个视图,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.views.decorators.cache import cache_page

@cache_page(60 * 15, key_prefix="site1")
def my_view(request):
    ...

cache_page的参数分别是缓存过期时间以及缓存key的前缀。 也可以在路由url.py中指定要缓存的页面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.views.decorators.cache import cache_page

urlpatterns = [
    url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
    #也可以这样,如果你的视图是classbase的话:
    url(r'^$', cache_page(60 * 60 * 10, key_prefix="blogindex")(views.IndexView.as_view()), name='index'),
]

如果你的视图是class base的话,可以这样使用缓存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import ListView

@method_decorator(cache_page(60*60), name='dispatch')
class MyListView(ListView):
    # Your view code here.

视图缓存的清除方式:

在django中可以使用cache_page的方式来缓存视图,但是如何删除指定视图的缓存呢?在文档中没找到清除的方式,但是在Google的时候找到了解决方案,我自己本地测试可以使用,不确定将来的版本会不会无效,下面先介绍下解决办法:

核心功能是这些:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def expire_view_cache(path, servername, serverport, key_prefix=None):
    from django.http import HttpRequest
    from django.utils.cache import get_cache_key

    request = HttpRequest()
    request.META = {'SERVER_NAME': servername, 'SERVER_PORT': serverport}
    request.path = path

    key = get_cache_key(request, key_prefix=key_prefix, cache=cache)
    if key:
        if cache.get(key):
            cache.delete(key)
        return True
    return False

其实就是构造一个HttpRequest对象,然后调用Django内部的get_cache_key来获得缓存key。 调用方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#site也可以直接指定,也就是当前站点的domain name
from django.contrib.sites.models import Site
site = Site.objects.get_current().domain
#path为要删除的视图缓存的路径,key_prefix为使用cache_page时指定的key_prefix
expire_view_cache(path, servername=site, serverport=port, key_prefix='blogdetail')

模版缓存

当然,也可以直接在模版中使用缓存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% load cache %}
{% cache 500 sidebar request.user.username %}
    .. sidebar for logged in user ..
{% endcache %}

参数分别是过期时间,缓存名,区分不同缓存的参数 模版缓存的删除方式就简单多了,以上面的配置为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.core.cache.utils import make_template_fragment_key
from django.core.cache import cache
username = self.request.user.username if self.request.user else ''
key = make_template_fragment_key('sidebar', [username])
cache.delete(key)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
31.Django缓存和信号
缓存  由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回 Django中提供了6种缓存方式: 开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块、pylibmc模块) 1.配置 # 此为开始调试用,实际内部不做任何操
zhang_derek
2018/04/11
1K0
Django缓存机制详解:从配置到实战应用
在Web开发中,性能优化是永恒的课题。当用户访问量激增时,数据库查询压力、视图渲染耗时等问题会成为系统瓶颈。Django作为Python生态的明星框架,其内置的缓存机制正是解决这类问题的利器。本文将以实战视角,带您从配置到应用全面掌握Django缓存技术。
富贵软件
2025/08/29
1420
Django缓存机制详解:从配置到实战应用
Django进阶之缓存和信号
一、缓存 简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者mem
coders
2018/01/04
9750
Django进阶之缓存和信号
Django缓存机制详解:从配置到实战应用
在Web开发中,性能优化是永恒的课题。当用户访问量激增时,数据库查询压力、视图渲染耗时等问题会成为系统瓶颈。Django作为Python生态的明星框架,其内置的缓存机制正是解决这类问题的利器。本文将以实战视角,带您从配置到应用全面掌握Django缓存技术。
富贵软件
2025/08/08
4590
Django缓存的6种方式及应用
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存memcached 、Redis中之前缓存的内容拿到,并返回。
菲宇
2019/06/12
1K0
Django缓存的6种方式及应用
Django 缓存6.2
缓存 对于中等流量的网站来说,尽可能地减少开销是必要的。缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源 Django自带了一个健壮的缓存系统来保存动态页面,避免对于每次请求都重新计算 Django提供了不同级别的缓存粒度:可以缓存特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者可以缓存整个网站 设置缓存 通过设置决定把数据缓存在哪里,是数据库中、文件系统还是在内存中 通过setting文件的CACHES配置来实现 参数TIMEOUT:缓存的默认过期时间,以秒为单
Lansonli
2021/10/09
4240
Django2.0中文(缓存)
1、settings.py中配置使用memcached缓存: CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/' // pip install python-memcached 2、使用数据库做缓存: python manage.py createcachetable [cache_table_name] CACHE_BACKEND = 'db://my_cache_table' 3、使用文件做缓存:需要运行的用户有读写该目录的权限 CACHE_BACKEND = 'file:///var/tmp/django_cache' 4、本地内存: CACHE_BACKEND = 'locmem:///' 5、使用自定义缓存:CACHE_BACKEND = 'path.to.backend://'
用户5760343
2022/05/14
3870
Django-缓存内容
将缓存存储在你的数据库中,可能是MySQL 说明: 尽管存储介质没有更换,但是当把每一次查询负责的结果存储到表里 比如多个条件的过滤查询结果,可避免重复进行查询。
Yuou
2022/09/26
4200
Django缓存机制详解:从配置到实战应用
缓存是指保存计算密集型操作的结果,当再次需要该结果时直接从缓存中获取,而无需重新计算。在 Django 中,缓存可以应用于不同粒度:
小王子1024
2025/07/28
1480
Django缓存机制详解:从配置到实战应用
第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} #index.html <h1>{{val.0}} 2.继承:一个html页面只能继承一个模板 extends 'layout.html' {{ block xxx}} ... {{endblock}} 3.组件: {{include tag.html}} 4.自定义函数: simple_tag:任意参数,不
玩蛇的胖纸
2018/06/08
6320
【Django】 开发:Cookie、Session和缓存
cookies 在浏览器上是以键 - 值对的形式进行存储的,键和值都是以 ASCII 字符串的形存储 (不能是中文字符串)
杨丝儿
2022/02/18
2K0
【Django】 开发:Cookie、Session和缓存
Django中的缓存系统与Web应用性能
在构建现代Web应用时,性能通常是至关重要的考虑因素之一。为了提高用户体验和应用的响应速度,开发人员经常会使用各种技术来优化其性能。其中,缓存是一种非常有效的方法之一。Django作为一个功能强大的Web框架,提供了强大的缓存系统,使开发人员能够轻松地实现缓存功能,从而提升Web应用的性能。
一键难忘
2024/06/18
3310
Django(39)使用redis配置缓存[通俗易懂]
  动态网站的基本权衡是,它们是动态的。每次用户请求页面时,Web服务器都会进行各种计算 – 从数据库查询到模板呈现再到业务逻辑 – 以创建站点访问者看到的页面。从处理开销的角度来看,这比标准的文件读取文件系统服务器要耗时多了。对于大多数Web应用程序来说,这种开销并不是什么大问题。因为大多数Web应用程序只是中小型网站,没有拥有一流的流量。但对于中到高流量的站点,尽可能减少开销是至关重要的,这就是缓存的用武之地。缓存某些内容是为了保存昂贵计算的结果,这样就不必在下次执行计算。 Django框架带有一个强大的缓存系统,可以保存动态页面,因此不必为每个请求计算它们。Django提供不同级别的缓存粒度:可以缓存特定视图的输出,也可以只缓存页面中难以生成的部分或者可以缓存整个站点。 Redis是一个内存数据库(现在已经支持内存数据持久化到硬盘当中,重新启动时,会自动从硬盘进行加载),由于其性能极高,因此经常作为中间件、缓存使用。
全栈程序员站长
2022/09/16
2.2K0
Django(39)使用redis配置缓存[通俗易懂]
高阶应用-缓存
对于一个中等流量网站,尽可能地减少开销是很有必要的。缓存数据就是为了保护那些需要很多计算资源的结果,这样就不必在下次重新消耗资源进行计算
星哥玩云
2022/09/14
4790
Django使用redis作为缓存系统
为了提升网站的性能,加一层缓存是少不了的,由于之前做的东西是用django写的,所以就介绍一下django的缓存系统。
earthchen
2020/09/24
7520
震惊!Django缓存中的数据频频丢失,究竟谁是幕后黑手!
Khalil
2017/07/26
2.1K1
震惊!Django缓存中的数据频频丢失,究竟谁是幕后黑手!
Django实战-星座运势接口封装
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/09/11
1K0
Django实战-星座运势接口封装
django开发中利用 缓存文件 进行页面缓存
Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。
雷子
2021/03/15
1.3K0
django开发中利用 缓存文件 进行页面缓存
django 三种缓存模式的使用及注意点
    @cache_control,@vary_on_headers,@vary_on_cookie 
用户1558882
2018/10/10
5580
django 三种缓存模式的使用及注意点
redis之django-redis
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户, 当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
人生不如戏
2019/02/13
1.2K0
相关推荐
31.Django缓存和信号
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档