django.contrib.staticfiles的扩展包!
项目描述
django-ecstatic是django.contrib.staticfiles的扩展包!请阅读完整的文档在readthedocs。
以下是它能做的事情
消除网络连接来计算文件哈希的需求。
仅收集已更改的静态文件。
在不失败于不存在文件的情况下,将内容哈希添加到您的文件名中。
创建静态清单以减少网络操作并简化部署。
Ecstatic的实用工具与django.contrib.staticfiles具有相同的接口,因此应该与您喜欢的Django存储库兼容。
哈希文件名 FTW
首先,您应该已经在使用Django的CachedFilesMixin或CachedStaticFilesStorage类,这些类向collectstatic命令添加了一个后处理步骤,将具有其内容哈希的文件名的静态文件的副本保存到文件中。如果您自己提供服务,这将允许您为您的资产设置远期过期时间,这将使您的网站用户感到高兴。这也意味着新版本的资产不会覆盖旧版本,如果部署的代码和静态文件不一致,这会破坏您的网站。
然而,为了获取内容哈希,这些类将使用您的应用程序的STATICFILES_STORAGE打开文件。如果您使用CDN,这意味着他们将执行网络操作。但是那些静态文件也保存在本地文件系统上——毕竟,它们是从某处收集的。这就是ecstatic.storage.CachedStaticFilesMixin和ecstatic.storage.CachedStaticFilesStorage的作用所在。它们不是使用存储类来获取哈希,而是使用您的应用程序的staticfiles查找器来查找本地版本并使用其哈希。(它们还有一些其他实用的功能。)使用与您选择的存储类一起使用mixin以获得这些好处
from ecstatic.storage import CachedStaticFilesMixin
from cumulus.storage import CloudFilesStaticStorage
class MyStaticFilesStorage(CachedStaticFilesMixin, CloudFilesStaticStorage):
pass
哈希文件名和构建文件
我记得我提到了ecstatic.storage.CachedStaticFilesMixin和ecstatic.storage.CachedStaticFilesStorage是如何工作的吗?它们计算静态文件的本地版本哈希。显然,那么,本地版本——即您的应用程序服务器上的静态文件——需要与您收集到CDN的版本相同。否则,应用程序服务器将得到不同的哈希并使用错误的URL!因此,如果您的项目需要构建步骤,您需要确保构建文件位于您的应用程序服务器上。有两种方法可以做到这一点
将您的构建文件包含在您的包中,并将其与您的应用程序代码一起部署。
在应用程序服务器上重新构建静态文件。
或者,您可以回退到使用django.contrib.staticfiles.storage.CachedFilesMixin或django.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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 04e8fe75a0ee56ecb39d7362886ca2a26c89eea70587cc367040487cbd88fcf4 |
|
MD5 | cd04bf89c80ae018280e90fcb107809c |
|
BLAKE2b-256 | 79919f9d41b1bd1cdf527a60e1edb67afb5e873938f60ea9b61c35daa37cc9b8 |