使用 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 版本控制的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章