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.png
,
AppDirectoriesFinder
将在每个INSTALLED_APPS
的static
子文件夹中查找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
,但实际上它可能是 myapp1
、myapp2
等
通过将它们从单个应用程序内部复制到单个文件夹中,您可以将前端 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 静态文件