Django与CDN无缝升级

时间:2011-09-24 16:07:52

标签: python django amazon-web-services cdn fabric

[我正在使用AWS,但我认为这个问题与所有CDN相关]

我希望将我的Django服务器无缝部署到AWS云 所有静态内容(例如图片,javascript等)都会转到Amazon Cloudfront CDN 问题是我试图尽可能地将升级变为“原子”,而我对CDN对象失效的时间控制很少。
根据TFM,解决方案是对我的对象进行版本化,即重命名它们添加版本ID,例如arrow_v123.png。显然,如果新服务器指向arrow_v124​​.png,我可以完全控制整个分发的时间 我查了一下,从我可以告诉大男孩们那样做 - Facebook静态内容对象有一个散列名称(和路径)。

但我如何在DJANGO中自动进行此操作?

我需要以某种方式:

  • 生成新版本号
  • 更改所有静态对象的所有名称
  • 更改所有模板和python代码以使用这些新名称

或以某种方式与开发过程集成:

  • 我编辑图片或javascript文件
  • 我保存了它并且它得到了一个新名字?!?!并且所有对它的引用都是自动更正的?!?!

我正在使用Fabric进行部署,所以我需要以某种方式修改我的fabfile。

请帮忙。

塔尔。

4 个答案:

答案 0 :(得分:3)

http://www.allbuttonspressed.com/projects/django-mediagenerator提供资产版本控制。它提供了一个函数和一个模板标记,为您提供实际文件名的版本化文件名。它还有一些很好的附加功能,如js / css缩小和连接。

答案 1 :(得分:1)

看一下html5boilerplate,有ant构建脚本,以及做很多其他事情,将你的静态js / CSS引用重命名为随机数,并将模板文件中的任何引用更改为这些新的随机编号的js / CSS 。我不认为它对图像资产的作用相同,但我认为可以更改ant文件以执行相同的操作。

html5boilerplate的Django端口在这里:https://bitbucket.org/samkuehn/django-html5-boilerplate

答案 2 :(得分:0)

对我来说,最后一部分(更改所有模板和python代码以使用新名称)很容易。将当前样式“版本号”存储在您的设置中。确保使用模板上下文将此版本号传递给模板。然后,在渲染模板时使用它来选择静态文件的真实URL。

发布一组新的静态文件涉及的步骤是:

  1. 将新文件发布到您的CDN
  2. 修改您的设置文件
  3. 重新加载您的应用程序设置
  4. 通过将版本号存储在数据库中而不是设置中,您可以使用类似的方案实现相同类型的效果。这样可以避免重新加载和更改,但会在每个视图渲染时添加数据库查询。

    如何将每个步骤集成到开发过程中取决于您自己。可以(有条件地)自动发布到CDN,编辑设置文件并重新启动应用程序。要轻松“编辑”设置文件,您可以将版本号存储在单独的文件中,并在启动时读取设置文件。

答案 3 :(得分:0)

我会在您经常更新的所有静态资产的末尾附加一个随机字符串。

示例:style.css将成为style.css?ASFDSF34343SDSFDSF

在调试模式下,我确保随机字符串在每个请求上发生更改,因此我的更改会立即生效。 (这可以防止浏览器缓存)

在生产中,随机字符串仅在启动时生成一次,然后重新使用。

你可以拥有它,以便在重新启动你的网络服务器后随机字符串仍然存在。

在开发和生产过程中,这对我来说都非常有效。

请注意,我将资产保留在S3上,尚未启用CloudFront。

以下是实际示例:

http://static.outsourcefactor.com/css/main.css?ASDFASFASF434434