首页 > 其他分享 >Django站点静态文件缓存相关问题

Django站点静态文件缓存相关问题

时间:2023-06-11 18:03:51浏览次数:46  
标签:文件 缓存 value js 站点 Django os css

《高性能网站建设指南》中有一条建议,为网站的页面、文件“添加 Expires 头”。这么做的好处就不多说了,实现方式也比较简单,不过,真的实施这条建议时,还是有许多问题需要考虑。


通常情况下,我们需要将图片、js、css 等不会经常更新的文件缓存起来,一般来说,配置服务器,为它们设置一个较远的未来的 Expires 时间就可以了(比如 1 年后)。不过,在一个经常会更改的网站中,某些 js/css 文件可能并不是一成不变的,虽然它们的更新频率比较低,但还是会不时地更新,我们希望在它们被更新后客户端也能及时更新,而不是依旧使用老的缓存。


解决这个问题的办法有很多,常用的一种是在这些 js/css 后面加上一个版本号或最后修改时间,比如:



<link href = "/css/c.css?v=0.1.2" rel = "stylesheet" type = "text/css" media = "screen" />
<script type = "text/javascript" src = "/js/c.js?v=3.0.1" > </script>

如上所示,文件地址后面跟了一个 v 参数,如果文件版本更新了,我们也只需要更改这个参数的值,用户的浏览器就会重新下载新的版本。


不过同时我们又遇到了新的问题:js/css 文件与上面的 HTML 通常是在两个文件中,有时一个 js/css 在很多 HTML 或模板中都有引用,如果一个 js/css 更新了,我们不得不手动更改这些 HTML 模板文件,这是一个很枯燥的工作,而且一不小心就会有遗漏。


好在我们使用的是 Django,我们可以有一些“Djangoly”的解决方法。前不久,我就看到一个很有创意的写法,类似于这样:




<link href = "{{ " /css /c .css "|file_time_stamp }}" rel = "stylesheet" type = "text/css" media = "screen" />
<script type = "text/javascript" src = "{{ " / js /c.js"|file_time_stamp }}"></s cript >

熟悉 Django 的朋友应该能立即明白,这儿自定义了一个 filterfile_time_stamp ,将 js/css 文件地址作为参数,读取相应文件的最后修改时间,附加到文件地址后面。最终生成的 HTML 形如:



<link href = "/css/c.css?fmts=1289306718.0" rel = "stylesheet" type = "text/css" media = "screen" />
<script type = "text/javascript" src = "/js/c.js?fmts=1287902444.0" > </script>

这样,当 js/css 文件发生变化时,最后修改时间也会发生变化,相应的参数也会变化


这个 filter 的实现很简单。不过我又想到另一个问题:如果页面访问量比较大,这个 filter 是否会导致硬盘的频繁读操作?如果使用缓存将文件的最后修改时间记住一小段时间会不会更好?于是有了下面的我的实现代码:



# 请将这一段加到你的自定义标签、过滤器文件中
import os
from django . core . cache import cache
# 注意,完整代码还需要 import 更多相关模块
# ...
 
@ register . filter ( name = "file_time_stamp" )
def file_time_stamp ( value ) :
u """
在 js/css 后面添加最后修改时间的时间戳,如:
/js/c.js -> /js/c.js?fmts=1289377595.3
如果没找取对应的文件,则直接返回原value
"""
 
cache_key = "_file_time_stamp__%s" % value
v = cache . get ( cache_key )
if v : # 如果指定缓存不存在,v 的值将为 None
return v
 
if value . startswith ( "/" ) :
fn = os.path . join ( ROOT_DIR , "media" , value [ 1 : ] . replace ( "/" , os . sep ) )
 
if os.path . isfile ( fn ) :
ts = os . stat ( fn ) . st_mtime
sp = "?" if "?" not in value else "&"
value = "%s%sfmts=%.1f" % ( value , sp , ts )
 
cache . set ( cache_key , value , 300 ) # 300 秒后缓存到期
 
return value


你可以在 settings.py 中指定使用哪种缓存,我使用的是内存缓存(CACHE_BACKEND = “locmem:///”)。


我也对使用缓存和直接用 os 模块读取文件最后修改时间两种方式的效率进行了简单的测试。不过,使用缓存并没有带来我原来预期的性能上的提高,相反,似乎比直接用 os 模块读取文件最后修改时间的性能还有略低一点。我将读取缓存与读取文件最后修改时间的操作各执行了 10 万次,在我的本本上(Ubuntu 10.04 系统),前者花费的时间约为 2.9 秒,后者约为 2.5 秒,不知道在使用 os 模块读取文件最后修改时间时,这个值是不是会在系统级别上缓存起来。



reference:http://oldj.net/article/django-site-static-file-cache/


标签:文件,缓存,value,js,站点,Django,os,css
From: https://blog.51cto.com/u_6186189/6458408

相关文章

  • Django使用redis缓存服务器
        redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,我在这里就不一一介绍了。那我们一般什么情况下才会使用缓存服务器呢?可不是什么情况都需要的哦,一般来说是在需要频繁对一个字段读取的时候才会需要将这......
  • Django的项目框架搭建
    1.1创建项目project,创建应用myapp#创建项目框架tpdemodjango-adminstartprojecttpdemocdproject#在项目中创建一个应用pythonmanage.pystartappmyapp#创建模板目录mkdirtemplatesmkdirtemplates/myapp如图所示1.2编辑tpdemo/tpdemo/sittings.py文件,配置......
  • Vue_Django 登录注册+图书管理系统
    Vue前端注册页面点击查看代码<template><divclass="register"><el-row:gutter="20"><el-col:span="12":offset="6"><divclass="grid-contentbg-purple">&......
  • Django3中分组查询的一个坑
    最近在学习django的分组查询,发现使用通常的values加annotate方法,获取不到我想要的结果,后来通过查询官方文档得到答案一、问题描述1.1模型fromdjango.dbimportmodels#Createyourmodelshere.classGoods(models.Model):g_name=models.CharField(max_length=......
  • Django的staticfiles库
    staticfiles库是Django提供的一个用于管理静态文件的库,它提供了一些工具和函数来帮助开发者在Django应用程序中管理和提供静态文件服务。在Django应用程序中,静态文件通常包括CSS样式文件、JavaScript脚本文件、图像文件以及其他一些资源文件。这些静态文件通常需要被服......
  • django
    1常用指令pipinstalldjango-ihttps://pypi.douban.com/simple/#使用豆瓣镜像安装djangodjango-adminstartprojectmysite#创建个人项目pythonmanage.pyrunserver#启动项目pythonmanage.pystartapppolls#创建投票应用pythonmanage.pymakemigrations#......
  • echart 多变联动下载图片清缓存
    一个系统中有多个图表的时候,多变联动下载他的图片会多出上次预览的图片的一部分 原因是没有清空echart的缓存//赋值变量this.myChart=this.$refs.chart[0]beforeDestroy(){//清缓存//@ts-ignorethis.myChart.clear();this.myChart={}} ......
  • Spring的三级缓存
    学习资料:https://www.bilibili.com/video/BV1dP411J7tQ/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • 老话新谈之缓存一致性
    前言缓存一致性常见的更新策略也比较多,如先更新数据库再更新缓存,先删缓存再更新数据库等等,我在理解的时候有些混乱,所以这个文章提供了一些理解上的技巧去理解缓存一致性。为什么会有缓存一致性的问题缓存与数据库是两套中间件,存在网络抖动之类的原因导致没有更新任一方的可能......
  • vue解决后端返回的图片路径名和原图片路径名相同时,浏览器缓存只会加载首次缓存的图片
    方法一:让后端更改返回的路径名字。方法二:前端自己处理。在图片路径后拼接随机数或者时间戳我用的是时间戳this.$refs.rotate.src=res.data.url+"?"+newDate().getTime() :src="formData.indexUrl+'?'+newDate().getTime()"......