跳转到主要内容

django.contrib.staticfiles的扩展包!

项目描述

django-ecstatic是django.contrib.staticfiles的扩展包!请阅读完整的文档在readthedocs

以下是它能做的事情

  • 消除网络连接来计算文件哈希的需求。

  • 仅收集已更改的静态文件。

  • 在不失败于不存在文件的情况下,将内容哈希添加到您的文件名中。

  • 创建静态清单以减少网络操作并简化部署。

Ecstatic的实用工具与django.contrib.staticfiles具有相同的接口,因此应该与您喜欢的Django存储库兼容。

哈希文件名 FTW

首先,您应该已经在使用Django的CachedFilesMixin或CachedStaticFilesStorage类,这些类向collectstatic命令添加了一个后处理步骤,将具有其内容哈希的文件名的静态文件的副本保存到文件中。如果您自己提供服务,这将允许您为您的资产设置远期过期时间,这将使您的网站用户感到高兴。这也意味着新版本的资产不会覆盖旧版本,如果部署的代码和静态文件不一致,这会破坏您的网站。

然而,为了获取内容哈希,这些类将使用您的应用程序的STATICFILES_STORAGE打开文件。如果您使用CDN,这意味着他们将执行网络操作。但是那些静态文件也保存在本地文件系统上——毕竟,它们是从某处收集的。这就是ecstatic.storage.CachedStaticFilesMixinecstatic.storage.CachedStaticFilesStorage的作用所在。它们不是使用存储类来获取哈希,而是使用您的应用程序的staticfiles查找器来查找本地版本并使用其哈希。(它们还有一些其他实用的功能。)使用与您选择的存储类一起使用mixin以获得这些好处

from ecstatic.storage import CachedStaticFilesMixin
from cumulus.storage import CloudFilesStaticStorage


class MyStaticFilesStorage(CachedStaticFilesMixin, CloudFilesStaticStorage):
    pass

哈希文件名和构建文件

我记得我提到了ecstatic.storage.CachedStaticFilesMixinecstatic.storage.CachedStaticFilesStorage是如何工作的吗?它们计算静态文件的本地版本哈希。显然,那么,本地版本——即您的应用程序服务器上的静态文件——需要与您收集到CDN的版本相同。否则,应用程序服务器将得到不同的哈希并使用错误的URL!因此,如果您的项目需要构建步骤,您需要确保构建文件位于您的应用程序服务器上。有两种方法可以做到这一点

  1. 将您的构建文件包含在您的包中,并将其与您的应用程序代码一起部署。

  2. 在应用程序服务器上重新构建静态文件。

或者,您可以回退到使用django.contrib.staticfiles.storage.CachedFilesMixindjango.contrib.staticfiles.storage.CachedStaticFilesStorage,尽管这样您又回到了使用网络操作来获取哈希的情况。

上述所有选项都有优缺点。如果您直接从版本控制部署,选项1意味着将编译文件提交到您的仓库,这可能会被认为是冗余。另一方面,选项2意味着您的应用服务器需要安装所有构建工具。这也意味着在新的代码部署期间,将引用旧资产(直到构建完成,存储可以获取新的哈希值)。

幸运的是,Ecstatic还有一个解决方案:ecstatic.storage.StaticManifestMixin。这个混入(mixin)就像ecstatic.storage.CachedStaticFilesMixin一样使用,但它会在一个清单文件中查找您的静态文件URL——完全绕过了计算本地文件哈希值的需求。

from ecstatic.storage import CachedStaticFilesMixin, StaticManifestMixin
from cumulus.storage import CloudFilesStaticStorage


class MyStaticFilesStorage(StaticManifestMixin, CachedStaticFilesMixin, CloudFilesStaticStorage):
    pass

使用这个混入,存储不再需要访问构建文件来确定它们的哈希值(因此是URL);它只需要访问清单文件。这意味着

  • 您不需要将构建的静态文件打包到您的应用中。

  • 您不需要在您的应用服务器上安装构建工具。

  • 存储类可以在新代码部署后立即查找新URL(以及新的静态文件清单)。

  • 我们仍然没有执行获取哈希值/URL的网络操作。

换句话说,我们已经解决了所有问题。太好了!

那么如何创建这个清单呢?首先,您需要向您的settings.py文件添加一个变量,让Ecstatic知道在哪里创建它

ECSTATIC_MANIFEST_FILE = os.path.join(os.path.dirname(__file__), 'staticmanifest.json')

然后只需运行createstaticmanifest管理命令

./manage.py createstaticmanifest

项目详情


下载文件

下载适合您平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

django-ecstatic-0.2.2.tar.gz (14.2 kB 查看哈希值)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面