使用Django为图像设置远期未来的最佳方法是什么?

时间:2009-09-11 15:13:40

标签: django

我正在使用django-compress,远期将来我的css和js文件过期。效果很好。

我想为其他静态内容(图片,flash等)做类似的事情。我可以设置此内容的远期过期,但我必须在文件更改时手动重命名。

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:6)

最好的方法是使用版本化的URL引用您的静态文件,并为您的Web服务器提供重写规则以忽略该版本。

查看完整的Django示例here,其中包含expire_tag帮助程序(由Arne Brodowski创建):

<link rel="stylesheet" type="text/css" 
  href="{{ MEDIA_URL }}{% expire_tag "css/reset.css" %}" />

相关的Apache重写规则。

答案 1 :(得分:4)

使用django-compress,您将CSS和JS视为动态文件 - 这很好。但是,其他文件是静态的 - 而Django并不真的想要提供这些文件。它们应该由Apache或其他网络服务器直接提供。

使用Apache,您可以使用类似

的内容
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
</FilesMatch>

.htaccess或全局Apache配置中。

更新:回复您的评论 - 抱歉,我不明白您问题的细微差别。您无法避免使用不同的URL向客户端指示文件(例如图像)已更改。这是建议的,例如阿帕奇和雅虎!

实施这一点是IMO不太难。它分为两部分:

  1. 使用标记(此处为useful snippet)生成将出现在HTML中的媒体文件的版本化URL。版本化的URL可以是插入版本的基本URL,例如, /media/3/header.png实际文件在服务器上保留为/media/header.png
  2. 使用mod_rewrite之类的工具将传入的网址转换为规范值,即/media/3/header.png的请求转换为/media/header.pngThis article更详细地介绍了该功能。