这可能是一个愚蠢的问题,但它并没有点击我的脑袋。
在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 /目录相同)
这有什么意义?是不是只创建了我所有静态文件的副本?
答案 0 :(得分:46)
好吧,单个Django 项目可能会使用多个应用,所以在那里你只有一个myapp
,实际上可能是myapp1
,myapp2
等
通过将各个应用程序内部的应用程序复制到一个文件夹中,您可以将前端Web服务器(例如nginx)指向该单个文件夹STATIC_ROOT
并从单个位置提供静态文件,而不是配置您的Web服务器从多个路径提供静态文件。
关于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
目录)/static/*
并将任何其他请求重定向到Django。 collectstatic
是一个现成的脚本,可以为您准备此目录,以便您可以将其直接连接到部署脚本。
答案 2 :(得分:18)
在生产安装中,您希望拥有永久URL。除非文件内容发生更改,否则URL不会更改。
这是为了防止客户端在从Django打开网页时在其计算机上安装错误版本的CSS或JS文件。 Django staticfiles会检测文件更改并相应地更新URL,这样如果CSS或JS文件发生更改,Web浏览器会下载新版本。
这通常是通过在collectstatic
运行期间向文件名添加MD5哈希来实现的。
编辑:另请参阅多个应用的相关答案。
答案 3 :(得分:6)
当网站中有多个django应用时,它非常有用。
然后, collectstatic
将在一个地方收集来自所有应用的静态文件 - 以便可以在生产环境中提供。