姜戈的收藏品有什么意义?

在 Django 中,约定是将所有特定于应用程序的静态文件(即 css、 js)放入名为 静电干扰的文件夹中。所以结构应该是这样的:

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

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

74738 次浏览

从多个应用程序收集静态文件到单个路径

好吧,一个 Django 项目可能使用几个 应用程序,所以虽然你只有一个 myapp,它可能实际上是 myapp1myapp2

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

使用 ManifestStaticFilesStorage的持久 URL

关于向文件名追加 MD5散列以进行版本控制的说明: 它不是 collectstatic默认行为的一部分,因为 settings.STATICFILES_STORAGE默认为 StaticFilesStorage(StaticFilesStorage不这样做)

例如,如果您将 MD5散列设置为使用 ManifestStaticFilesStorage,它将添加该行为。

此存储的目的是保持为旧文件提供服务,以防万一 有些页面仍然引用这些文件,例如,因为它们是由 您或第三方代理服务器。此外,它是非常有用的,如果 您希望将远期过期标头应用于已部署的文件 加快后续页面访问的加载时间。

当站点中有多个 django 应用程序时,它非常有用。

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

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

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

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

编辑: 还可以看到对多个应用程序的相关回答。

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

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

现在: 这只有在使用 DEBUG = 1运行 manage.py runserver时才有效。当您启动时,Django 流程将不再服务于静态资产。使用 Django 来提供这些服务是没有效率的,有专门针对这一点的更专业的工具。

相反,你应该这样做:

  • 找到每个应用程序中的所有静态文件
  • 构建一个包含所有目录的单个目录
  • 将它们上传到某个地方(在你的网络服务器上的某个 static目录或者第三方文件存储)
  • 配置您的 webserver (比如 nginx) ,以便直接从该目录服务 /static/*,并将任何其他请求重定向到 Django。

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