Django的collectstatic有什么意义?

问题描述 投票:73回答:4

这可能是一个愚蠢的问题,但这不是在我的头上单击。

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

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

python django django-staticfiles static-files collectstatic
4个回答
61
投票

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

嗯,一个Django project可能使用多个apps,因此虽然那里只有一个myapp,但实际上可能是myapp1myapp2

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

带有ManifestStaticFilesStorage的永久URL

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

例如,MD5哈希会加入如果您将其设置为使用ManifestStaticFilesStorage,则该广告会宣传该行为。

此存储空间的目的是继续提供旧文件,以防万一某些页面仍引用这些文件,例如因为它们被缓存您或第三方代理服务器。此外,如果您想将远期Expires标头应用于已部署的文件加快后续页面访问的加载时间。


40
投票

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

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

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

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

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

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


23
投票

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

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

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

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


7
投票

当站点内有多个django应用程序时非常有用。

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

© www.soinside.com 2019 - 2024. All rights reserved.