Django 的 collectstatic 有啥意义?

Posted

技术标签:

【中文标题】Django 的 collectstatic 有啥意义?【英文标题】:What's the point of Django's collectstatic?Django 的 collectstatic 有什么意义? 【发布时间】:2016-04-07 18:26:29 【问题描述】:

这可能是一个愚蠢的问题,但它只是没有在我的脑海中点击。

在 Django 中,约定是将应用程序特定的所有静态文件(即 css、js)放入名为 static 的文件夹中。所以结构看起来像这样:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

mysite/settings.py 我有:

STATIC_ROOT = 'staticfiles'

所以当我运行命令时:

python manage.py collectstatic   

它在根级别创建一个名为staticfiles 的文件夹(与myapp/ 相同的目录)

这有什么意义?它不只是创建我所有静态文件的副本吗?

【问题讨论】:

【参考方案1】:

Django 静态文件可以在很多地方。作为/static/img/icon.png 的文件可以come from many places。默认情况下:

FileSystemFinder 将在每个STATICFILES_DIRS 中查找img/icon.pngAppDirectoriesFinder 将在每个INSTALLED_APPSstatic 子文件夹中查找img/icon.png。这允许 Django Admin 等库将自己的静态文件添加到您的应用中。

现在:这仅在您使用 DEBUG=1 运行 manage.py runserver 时才有效。当您上线时,Django 进程将不再为静态资产提供服务。使用 Django 来提供这些服务会效率低下,有更专门的工具专门用于此。

相反,您应该这样做:

从每个应用中查找所有静态文件 建立一个包含所有这些的单个目录 将它们上传到某处(网络服务器上某处的static 目录或第三方文件存储) 配置您的网络服务器(例如 nginx)直接从该目录提供 /static/* 并将任何其他请求重定向到 Django。

collectstatic 是一个现成的脚本,可以为您准备好这个目录,这样您就可以将它直接连接到您的部署脚本。

【讨论】:

更新了 Django 如何查找静态文件的链接:come from many places【参考方案2】:

将来自多个应用的​​静态文件收集到一个路径中

嗯,一个 Django project 可能会使用多个 apps,所以虽然你只有一个 myapp,但实际上它可能是 myapp1myapp2

通过将它们从单个应用程序内部复制到单个文件夹中,您可以将前端 Web 服务器(例如 nginx)指向该单个文件夹 STATIC_ROOT 并从单个位置提供静态文件,而不是将您的 Web 服务器配置为从多个路径提供静态文件。

带有ManifestStaticFilesStorage 的永久 URL

关于将 MD5 哈希附加到文件名以进行版本控制的说明:它不是 collectstatic 的默认行为的一部分,因为 settings.STATICFILES_STORAGE 默认为 StaticFilesStorage(它不会这样做)

MD5 哈希值会在例如如果您将其设置为使用ManifestStaticFilesStorage,则会添加该行为。

此存储的目的是继续提供旧文件以防万一 有些页面仍然引用这些文件,例如因为它们被缓存 您或第三方代理服务器。此外,如果 您想将遥远的未来 Expires 标头应用于已部署的文件以 加快后续页面访问的加载时间。

【讨论】:

你想说很容易找到提供静态内容的网络服务器【参考方案3】:

在生产安装中,您希望拥有永久 URL。除非文件内容更改,否则 URL 不会更改。

这是为了防止客户端在从 Django 打开网页时在他们的计算机上拥有错误版本的 CSS 或 JS 文件。 Django staticfiles 检测文件更改并相应地更新 URL,以便如果 CSS 或 JS 文件更改,Web 浏览器会下载新版本。

这通常通过在collectstatic 运行期间将 MD5 哈希添加到文件名来实现。

编辑:另见多个应用的​​相关答案。

【讨论】:

好一个!不知道 “通常通过添加 MD5 哈希实现”你的意思是ManifestStaticFilesStorage?不错,没看过 我认为默认情况下没有 MD5 散列,因为 settings.STATICFILES_STORAGE 默认为 StaticFilesStorage,所以 MD5 只会在你之后启动,例如将其设置为ManifestStaticFilesStorage,对吗? @MikkoOhtamaa 但是前端应用程序如何知道它应该链接到哪个文件名,因为后者总是改变? @lapin 好问题!自然需要存在 1) 映射到最新版本和 2) 传达此信息的方式。通常它存储在某个文件中,然后当您询问“最新版本 X 的完整 URL”时,它会给您一个结果。【参考方案4】:

当站点中有多个 django 应用时,它很有用。

collectstatic 然后将所有应用程序的静态文件收集到一个位置 - 以便在生产环境中提供。

【讨论】:

以上是关于Django 的 collectstatic 有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

Django:“collectstatic”也应该收集媒体文件吗?

Django collectstatic 没有这样的文件或目录

Django,即使在 collectstatic 之后也没有提供 uwsgi 静态文件

Django collectstatic 不覆盖生产文件

使用 Django 存储和 S3 在 collectstatic 上出现 MemcachedError

Heroku 上的 webpack 和 django:collectstatic 之前的捆绑