Django 的 collectstatic 有什么意义?

What's the point of Django's collectstatic?

在 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/ 相同的目录)

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

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

好吧,一个 Django 项目 可能会使用多个 apps,所以虽然你只有一个 myapp,但它实际上可能是 myapp1myapp2、等等

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

具有 ManifestStaticFilesStorage

的永久 URL

关于将 MD5 散列附加到文件名以进行版本控制的注意事项:它不是 collectstatic 默认行为的一部分,因为 settings.STATICFILES_STORAGE 默认为 StaticFilesStorage(这不是不要那样做)

MD5 散列将启动,例如如果您将其设置为使用 ManifestStaticFilesStorage,则会添加该行为。

The purpose of this storage is to keep serving the old files in case some pages still refer to those files, e.g. because they are cached by you or a 3rd party proxy server. Additionally, it’s very helpful if you want to apply far future Expires headers to the deployed files to speed up the load time for subsequent page visits.

当站点中有多个 Django 应用程序时,它很有用。

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

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

这是为了防止客户端在从 Django 打开网页时在其计算机上安装错误版本的 CSS 或 JS 文件。 Django staticfiles 检测文件更改并相应地更新 URLs,因此如果 CSS 或 JS 文件更改,网络浏览器会下载新版本。

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

编辑:另请参阅多个应用的​​相关答案。

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

  • FileSystemFinder 将在每个 STATICFILES_DIRS
  • 中查找 img/icon.png
  • AppDirectoriesFinder 将在每个 INSTALLED_APPSstatic 子文件夹中查找 img/icon.png。这允许像 Django Admin 这样的库将它们自己的静态文件添加到您的应用程序中。

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

相反,您应该这样做:

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

collectstatic 是一个 ready-made 脚本,它为您准备此目录,以便您可以将其直接连接到您的部署脚本。