使用 Django 静态 URL 版本控制的最简单方法?

Posted

技术标签:

【中文标题】使用 Django 静态 URL 版本控制的最简单方法?【英文标题】:Easiest Way to Use Django Static Url Versioning? 【发布时间】:2013-11-07 21:36:31 【问题描述】:

我继承了一个 Django 应用程序,它使用 s3 之上的 Cloudfront 作为 CDN 来提供静态文件。目前,此应用程序在提供其静态文件时不使用版本控制。这真的很烦人,因为这意味着 Cloudfront 不会重新加载文件,直到它们在那里过期,人们有时会从他们的计算机缓存中加载旧文件。我可以通过添加版本控制来解决这两个问题——提供来自以下位置的文件:cloudfront_url/git_tag/static/*。我的问题是:配置它的最佳方法是什么?我正在考虑只使用我当前签出的 git 标记,并在 settings.py 中添加一个管道到git describe,我在其中设置我的 STATIC_URL 以将当前签出的标记合并到 STATIC_URL 中。有没有更规范的方式来做到这一点?我不能成为第一个想要做这种事情的 Django 用户。

【问题讨论】:

【参考方案1】:

虽然我不熟悉与 Cloudfront 集成的步骤,但您可以使用 Django 的 CachedFileStorage 生成带有附加到文件名的 md5 哈希的资产。这意味着,无论何时您修改文件,您都将生成一个新的独特资产。

你需要做的就是设置

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.CachedStaticFilesStorage'

然后运行manage.py collectstatic

这将在您 collectstatic 输出到 (STATIC_ROOT) 的文件夹中创建资产。我想你从这里上传到 Cloudfront。您的STATIC_URL 我想也指向 Cloudfront。

在您的模板中,不要使用 % STATIC_URL %/asset.extension 之类的引用

% load static from staticfiles %
<img src="% static "images/hi.jpg" %"  />

这会将资产适当地映射到正确的资产。

请参阅有关 CachedFileStorage 的文档以了解更多信息,但这是一个非常方便的东西,它已融入 Django 但默认情况下未启用。它完全符合您的要求,确保您始终提供新资源,而不是返回陈旧的 js、css 或图像。

【讨论】:

虽然这可能有效,但需要进行一些调整。默认情况下,Django 尝试在其缓存后端缓存“静态名称 -> 散列文件”映射。如果启用缓存,则资源更新后仍会从static 返回不正确的文件名。如果禁用缓存,则必须在每次访问时计算哈希值,这可能非常繁重。如果使用这种方法,您需要在更新资源时清除缓存。 这确实不适用于 S3/CloudFront,因为它需要不同的存储后端。

以上是关于使用 Django 静态 URL 版本控制的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

Django框架静态文件配置和URL解析

django 静态文件版本控制

Django 中 js 和 css 的版本控制

django中怎么载入css等静态文件

Django1.11加载静态文件

Django中配置静态文件夹static