Django的收藏有什么意义?

时间:2016-01-04 06:57:57

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

这可能是一个愚蠢的问题,但它并没有点击我的脑袋。

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

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

4 个答案:

答案 0 :(得分:46)

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

好吧,单个Django 项目可能会使用多个应用,所以在那里你只有一个myapp,实际上可能是myapp1myapp2

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

ManifestStaticFilesStorage

的持久性网址

关于MD5哈希附加到版本控制文件名的说明:它不属于collectstatic的默认行为,因为settings.STATICFILES_STORAGE默认为StaticFilesStorage(其中不这样做)

MD5哈希将启动,例如如果您将其设置为使用ManifestStaticFilesStorage,那就是广告的行为。

  

此存储的目的是保持服务旧文件以防万一   一些页面仍然引用那些文件,例如因为它们被缓存了   您或第三方代理服务器。此外,它是非常有帮助的   您希望将远期的Expires标头应用于已部署的文件   加快后续页面访问的加载时间。

答案 1 :(得分:27)

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

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

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

相反,你应该这样做:

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

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

答案 2 :(得分:18)

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

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

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

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

答案 3 :(得分:6)

当网站中有多个django应用时,它非常有用。

然后,

collectstatic将在一个地方收集来自所有应用的静态文件 - 以便可以在生产环境中提供。