django.contrib.staticfiles的扩展包!
django-ecstatic的Python项目详细描述
django摇头丸是一个django.contrib.staticfiles的扩展包! 阅读readthedocs上的完整文档。
它可以做到以下几点:
- 不需要网络连接来计算文件哈希值。
- 只收集已更改的静态文件。
- 创建静态清单以减少网络操作并简化部署。
狂喜的特性与 django.contrib.staticfiles,因此它们应该与您的收藏夹兼容 Django存储库。
哈希文件名ftw
首先,您应该已经使用Django的CaseDeFielSmithin或 CachedStaticFilesStorage类,它向collectstatic
保存静态文件副本的命令
文件名中的内容。如果你自己提供文件,这将
允许您为您的资产设置far-future expirations,这将使
你网站的用户很高兴。这也意味着新版本的资产不会
覆盖旧版本,如果部署的代码和
静态文件不同步。但是,为了获得内容散列,这些类将打开文件 使用应用程序的STATICFILES_STORAGE。如果你使用CDN,这意味着 他们将执行网络操作。但是那些静态文件保存在 毕竟,本地文件系统也是从某个地方收集的。那是 其中ecstatic.storage.CachedStaticFilesMixin和 ecstatic.storage.CachedStaticFilesStorage进来。而不是使用 存储类若要获取哈希值,它们将使用应用程序的静态文件查找器来 找到本地版本并使用其哈希。(他们还有一些其他的便利 特性)使用MIXIN和您选择的存储类来获得 优点:
fromecstatic.storageimportCachedStaticFilesMixinfromcumulus.storageimportCloudFilesStaticStorageclassMyStaticFilesStorage(CachedStaticFilesMixin,CloudFilesStaticStorage):pass
哈希文件名和生成的文件
记得我提到ecstatic.storage.CachedStaticFilesMixin和 ecstatic.storage.CachedStaticFilesStorage工作了吗?他们计算散列数 静态文件的本地版本。很明显,那么,当地人 版本也就是说,应用服务器上的静态文件需要与 你收集到你的CDN。否则,应用服务器将变得不同 散列并使用错误的url!所以如果你的项目需要一个构建步骤,你需要 以确保生成的文件位于应用服务器上。有两种方法 为此:
- 在包中包含生成的文件,并将它们与 你的申请代码。
- 在应用服务器上重新生成静态文件。
或者,您可以继续使用 django.contrib.staticfiles.storage.CachedFilesMixin或 django.contrib.staticfiles.storage.CachedStaticFilesStorage,尽管如此 你又回到了使用网络操作来获取散列的情况。
以上所有选择都有利弊。如果直接从 版本控制,选项1意味着将编译的文件提交到 存储库,您可能会认为它臃肿。另一方面,选项2意味着 应用服务器需要安装所有生成工具。这也意味着 在部署新代码时会有一段时间,但它引用了 旧资产(直到构建完成,以便存储可以获得新哈希)。
幸运的是,狂喜还有另一个解决方案: ecstatic.storage.StaticManifestMixin。这种混合剂就像使用一样。 ecstatic.storage.CachedStaticFilesMixin,但它会查找您的静态文件 清单文件中的url完全避开了计算散列的需要 本地文件的。
fromecstatic.storageimportCachedStaticFilesMixin,StaticManifestMixinfromcumulus.storageimportCloudFilesStaticStorageclassMyStaticFilesStorage(StaticManifestMixin,CachedStaticFilesMixin,CloudFilesStaticStorage):pass
注意
注意,我们仍然包含CachedStaticFilesMixin。它(或 django的版本)仍然需要进行后期处理,并找出 应该在清单中插入哪个url。
使用此MIXIN,存储不再需要访问已构建的文件。 确定它们的散列(因此还有url);它只需要访问 清单文件。这意味着:
- 您不需要将生成的静态文件打包到应用程序中。
- 您不需要在应用服务器上安装生成工具。
- 存储类可以在新代码出现后立即查找新的url部署 (以及一个新的staticfiles清单)。
- 我们仍然没有执行网络操作来获取散列/url。
换句话说,我们已经解决了所有的问题。耶!
那么如何创建这个清单呢?首先,您需要向 settings.py文件,让狂喜知道在哪里创建它:
ECSTATIC_MANIFEST_FILE=os.path.join(os.path.dirname(__file__),'staticmanifest.json')
然后运行createstaticmanifestmanagement命令:
./manage.py createstaticmanifest
注意
运行createstaticmanifest时,请确保django设置 您使用的是包含正确的STATICFILES_STORAGE。如果你有 设置不同STATICFILES_STORAGE的local_settings.py, 清单将包含它报告的url!