Django的collectstatic有什么意义?

2024-06-06 04:33:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 文件djangopy文件夹应用程序settingsmanage静态
3条回答

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来提供这些服务是低效的,有更多专门的工具专门用于此。

相反,你应该这样做:

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

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

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

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

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

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

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

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

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

具有ManifestStaticFilesStorage的持久url

关于MD5散列被附加到文件名以进行版本控制的注意事项:它不是collectstatic的默认行为的一部分,因为settings.STATICFILES_STORAGE默认为StaticFilesStorage(这不起作用)

MD5散列将启动,例如,如果您将其设置为使用ManifestStaticFilesStorage,则会显示该行为。

The purpose of this storage is to keep serving the old files in case some pages still refer to those files, e.g. because they are cached by you or a 3rd party proxy server. Additionally, it’s very helpful if you want to apply far future Expires headers to the deployed files to speed up the load time for subsequent page visits.

相关问题 更多 >