【问题标题】: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/ 相同的目录)

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

【问题讨论】:

    标签: python django django-staticfiles static-files collectstatic


    【解决方案1】:

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

    • FileSystemFinder 将在每个STATICFILES_DIRS 中查找img/icon.png
    • AppDirectoriesFinder 将在每个INSTALLED_APPSstatic 子文件夹中查找img/icon.png。这允许 Django Admin 等库将自己的静态文件添加到您的应用中。

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

    相反,您应该这样做:

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

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

    【讨论】:

    【解决方案2】:

    将来自多个应用的​​静态文件收集到一个路径中

    嗯,一个 Django project 可能会使用多个 apps,所以虽然你只有一个 myapp,但实际上它可能是 myapp1myapp2

    通过将它们从单个应用程序内部复制到单个文件夹中,您可以将前端 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 然后将所有应用程序的静态文件收集到一个位置 - 以便在生产环境中提供。

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 2014-08-29
      • 2019-07-05
      • 2011-09-26
      • 2010-11-29
      • 2010-10-15
      • 2011-02-05
      • 2012-02-28
      • 2018-01-13
      相关资源
      最近更新 更多