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.CachedStaticFilesMixinecstatic.storage.CachedStaticFilesStorage进来。而不是使用 存储类若要获取哈希值,它们将使用应用程序的静态文件查找器来 找到本地版本并使用其哈希。(他们还有一些其他的便利 特性)使用MIXIN和您选择的存储类来获得 优点:

fromecstatic.storageimportCachedStaticFilesMixinfromcumulus.storageimportCloudFilesStaticStorageclassMyStaticFilesStorage(CachedStaticFilesMixin,CloudFilesStaticStorage):pass

哈希文件名和生成的文件

记得我提到ecstatic.storage.CachedStaticFilesMixinecstatic.storage.CachedStaticFilesStorage工作了吗?他们计算散列数 静态文件的本地版本。很明显,那么,当地人 版本也就是说,应用服务器上的静态文件需要与 你收集到你的CDN。否则,应用服务器将变得不同 散列并使用错误的url!所以如果你的项目需要一个构建步骤,你需要 以确保生成的文件位于应用服务器上。有两种方法 为此:

  1. 在包中包含生成的文件,并将它们与 你的申请代码。
  2. 在应用服务器上重新生成静态文件。

或者,您可以继续使用 django.contrib.staticfiles.storage.CachedFilesMixindjango.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!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我能知道文件的哪个条目正在被修改吗?   多线程Java并发线程   java抓取包含多个页面的多个字母标签的网站   为什么if语句不排除Java中的另一个if语句?   Java可序列化哈希映射到ByteArray以创建blob   JavaEclipseLombokBuilder添加新建议   java将文件路径数组转换为文件数组,并计算每个文件的大小   在Java8流中添加大小数   Bouncy Castle 1.46之前版本的java兼容性问题   无法在AWS设备场上运行安卓 Java Appium测试   java为什么不使用mavenwarplugin将键与“WEBINF/classes/METAINF/MANIFEST.MF”合并?   java如何在引用子类的成员时调用super()   找不到java TestFx无头MonoclePlatformFactory   java AbstractMethodError onClientSessionEvent和“缺少控制媒体的权限”   正则表达式如何使用JAVA在字符串的大写字母前插入空格?   我的Spring安全项目中的java BCrypt(Spring安全)   java在我的网站上查看小程序更新时遇到问题   java如何使用schedule方法