Python中Django站点缓存详解与使用指南

本文和大家分享的主要是 django 缓存中站点缓存相关内容,一起来看看吧,希望对大家学习 django 有所帮助。

缓存整个站点,是最简单的缓存方法

在 MIDDLEWARE_CLASSES 中加入 “ update ” 和 “ fetch ” 中间件

MIDDLEWARE_CLASSES = (

‘ django.middleware.cache.UpdateCacheMiddleware ’, #第一

'django.middleware.common.CommonMiddleware',

‘ django.middleware.cache.FetchFromCacheMiddleware ’, #最后

)

“ update ” 必须配置在第一个

“ fetch ” 必须配置在最后一个

参数配置

CACHE_MIDDLEWARE_ALIAS 缓存别名(默认:default )

CACHE_MIDDLEWARE_SECONDS – 每个页面的缓存时间(s)(默认:600s)

CACHE_MIDDLEWARE_KEY_PREFIX – 如果缓存被多个使用相同 Django 安装的站点共享,配置此参数为站点名称或其它能代表站点的唯一字符串,以防止 key 冲突。如果不在意,可为空。

//对中间件进行说明

FetchFromCacheMiddleware

会缓存 GET 和 HEAD 200 状态的 responses,而且这些 request 和 response 的 headers 是允许的;

同一个 URL request, 不同查询参数,他的 Responses 会被作为不同 page 分别缓存;

这个中间件期待用具有相同 response headers 的 GET request 的 response 进行响应,这样它就可以用缓存的 GET response 响应 HEAD request。

UpdateCacheMiddleware

此中间件会在每个 HttpResponse 中自动设置一些 headers:

对于一个页面的新版本(未被缓存过)的请求,设置 Last-Modified header 为当前日期 /时间;

设置 Expires header 为当前时期 /时间 + 定义的 CACHE_MIDDLEWARE_SECONDS

设置 Cache-Control header 的 max age 指令为 CACHE_MIDDLEWARE_SECONDS (max age 是指缓存的内容将在多少秒后失效)

特殊情况:

如果 view 设置了自己的 cache 过期时间 (如:设置了 Cache-Control 的 max-age), 则页面的缓存过期时间会以 view 的过期时间为准。

原文链接: http://www.maiziedu.com/wiki/django/site/


Python中Django站点缓存详解与使用指南

1 回复

帖子内容呢?没看到具体问题。是问怎么用Django的缓存框架,还是遇到了什么具体的缓存问题?比如整站缓存、视图缓存还是模板片段缓存?

Django的缓存确实挺全的,从低级别的缓存API到高级的整站缓存都有。最常用的几个地方:

  1. 整站缓存:用django.middleware.cache.CacheMiddleware,在settings.py里配一下中间件和缓存后端就行。适合变化不频繁的站点。

  2. 视图缓存:用cache_page装饰器,直接缓存整个视图的输出。可以按用户、按请求参数来区分缓存。

  3. 模板片段缓存:在模板里用{% cache %}标签缓存页面的一部分,特别适合那些耗时的查询结果。

  4. 低级APIfrom django.core.cache import cache,可以缓存任何Python对象,比如查询集、计算结果这些。

举个例子,缓存一个视图10分钟:

from django.views.decorators.cache import cache_page

@cache_page(60 * 10)
def my_view(request):
    # 你的视图逻辑
    return render(request, 'template.html')

或者在模板里缓存一个区块:

{% load cache %}
{% cache 600 sidebar request.user.username %}
    <!-- 耗时的侧边栏内容 -->
{% endcache %}

缓存后端可以用内存、数据库、文件系统或者像Redis/Memcached这样的专业缓存。生产环境一般用Redis,性能好还支持分布式。

关键是要想清楚什么该缓存、缓存多久。数据更新频繁的就不适合缓存太久,不然用户看到的就是旧数据。可以用缓存版本号或者手动删除缓存来保证数据一致性。

总之,根据你的具体场景选合适的缓存策略。

回到顶部