codecamp

Django4.0 缓存框架-使用其他标头控制高速缓存

缓存的其他问题是数据的隐私和数据应该存储在缓存的级联中的问题。

用户通常面临两种缓存:他们自己的浏览器缓存(私有缓存)和他们的提供者的缓存(公共缓存)。 公共缓存由多个用户使用并由其他人控制。 这会给敏感数据带来问题——例如,您不希望将您的银行帐号存储在公共缓存中。 因此,Web 应用程序需要一种方法来告诉缓存哪些数据是私有的,哪些是公共的。

解决方案是指出一个页面的缓存应该是私有的。在 Django中,使用 ​cache_control() ​。例子:

from django.views.decorators.cache import cache_control

@cache_control(private=True)
def my_view(request):
    ...

这个装饰器负责在场景后面发送适当的 HTTP 头。

注意,缓存控制设置“私有”和“公共”是互斥的。装饰器确保“公共”指令被移除,如果应该设置“私有”(反之亦然)。这两个指令的一个示例使用将是一个提供私人和公共条目的博客站点。公共条目可以缓存在任何共享缓存上。下面的代码使用 ​patch_cache_control()​,手动修改缓存控制头的方法(内部调用的是 ​cache_control()​ 装饰器):

from django.views.decorators.cache import patch_cache_control
from django.views.decorators.vary import vary_on_cookie

@vary_on_cookie
def list_blog_entries_view(request):
    if request.user.is_anonymous:
        response = render_only_public_entries()
        patch_cache_control(response, public=True)
    else:
        response = render_private_and_public_entries(request.user)
        patch_cache_control(response, private=True)

    return response

你也可以通过其他方式控制下游缓存。比如,即使你没有使用 Django 服务器端的缓存框架,你仍然可以告诉客户端使用 ​max-age​ 指令缓存视图一段时间。

from django.views.decorators.cache import cache_control

@cache_control(max_age=3600)
def my_view(request):
    ...

(如果你使用缓存中间件,它已经使用 ​CACHE_MIDDLEWARE_SECONDS​ 设置的值设置了 ​max-age​ 。在这个例子里,​cache_control()​ 装饰器里自定义的 ​max_age​ 将被优先使用,头值将被正确合并。)
任何有效的 ​Cache-Control​ 响应指令在 ​cache_control()​ 中是有效的。这里有很多例子:

  • no_transform​=​True
  • must_revalidate​=​True
  • stale_while_revalidate​=​num_seconds
  • no_cache​=​True

已知指令的列表在 IANA registry 都能被找到(注意不是所有的都适用于响应)。
如果你想使用头部来完全禁用缓存,​never_cache()​ 是一个视图装饰器,用来添加头部确保响应不被浏览器或其他缓存进行缓存。比如:

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
    ...


Django4.0 缓存框架-使用Vary标头
Django4.0 缓存框架-MIDDLEWARE顺序
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Django4.0 模型和数据库

Django4.0 处理HTTP请求

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }