Django的collectstatic有什么意义?


86

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

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

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

Answers:


69

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

那么,一个Django的项目可以使用多个应用程序,因此虽然你只有一个myapp,它实际上可能是myapp1myapp2

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

带有ManifestStaticFilesStorage的永久URL

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

例如,如果将MD5哈希值设置为使用ManifestStaticFilesStorage,则将启动MD5哈希值,从而对该行为进行广告宣传。

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


2
您想说的是,很容易找到Web服务器来提供静态内容
babygame0ver '18

44

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

  • FileSystemFinder将查找img/icon.png在每个STATICFILES_DIRS
  • AppDirectoriesFinder将查找img/icon.pngstatic每个你的子文件夹INSTALLED_APPS。这样,像Django Admin这样的库就可以将自己的静态文件添加到您的应用中。

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

相反,您应该执行以下操作:

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

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


25

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

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

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

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


1
好一个!不知道
doniyor

“通常通过添加MD5哈希来实现”是指ManifestStaticFilesStorage吗?很好,我还没看过
Kos

3
我认为默认情况下不会进行MD5哈希处理,因为settings.STATICFILES_STORAGE默认为StaticFilesStorage,因此MD5仅在将其设置为时才启动,对ManifestStaticFilesStorage吗?
2016年

@MikkoOhtamaa但是既然前端应用程序总是在变化,那么前端应用程序如何知道它应该链接到哪个文件名呢?
lapin

@lapin好问题!自然地需要存在1)映射到最新版本和2)进行通信的方式。通常,它存储在某个位置的文件中,然后当您询问“最新版本的X的完整URL”时,它将给出结果。
Mikko Ohtamaa

9

当站点内有多个Django应用程序时,此功能很有用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.