121

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

在 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/

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

4

4 回答 4

88

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

好吧,一个 Django项目可能会使用多个应用程序,所以虽然你只有一个应用程序,myapp但实际上可能是myapp1,myapp2等等

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

带有ManifestStaticFilesStorage的持久 URL

关于将 MD5 哈希附加到文件名以进行版本控制的注释:它不是 的默认行为的一部分collectstaticsettings.STATICFILES_STORAGE默认为StaticFilesStorage(不这样做)

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

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

于 2016-01-04T07:03:13.933 回答
52

Django 静态文件可以在很多地方。提供的文件/static/img/icon.png可能来自许多地方。默认:

  • FileSystemFinderimg/icon.png在每一个中寻找STATICFILES_DIRS
  • AppDirectoriesFinderimg/icon.pngstatic每个INSTALLED_APPS. 这允许像 Django Admin 这样的库将它们自己的静态文件添加到您的应用程序中。

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

相反,您应该这样做:

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

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

于 2016-01-04T07:11:41.783 回答
27

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

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

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

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

于 2016-01-04T07:03:39.180 回答
14

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

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

于 2016-01-04T07:03:30.597 回答