【问题标题】:Easiest Way to Use Django Static Url Versioning?使用 Django 静态 URL 版本控制的最简单方法?
【发布时间】: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 用户。

【问题讨论】:

    标签: django cdn amazon-cloudfront


    【解决方案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" %}" alt="Hi!" />
    

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

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

    【讨论】:

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