这可能是一个愚蠢的问题,但这不是在我的头上单击。
在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/
相同的目录)
这有什么意义?它不只是创建我所有静态文件的副本吗?
嗯,一个Django project可能使用多个apps,因此虽然那里只有一个myapp
,但实际上可能是myapp1
,myapp2
等
通过将它们从单个应用程序内部复制到单个文件夹中,您可以将前端Web服务器(例如nginx)指向该单个文件夹STATIC_ROOT
,并从单个位置提供静态文件,而不是将Web服务器配置为来自多个路径的静态文件。
关于将MD5哈希附加到文件名以进行版本控制的注释:这不是collectstatic
默认行为的一部分,因为settings.STATICFILES_STORAGE
默认为StaticFilesStorage
(不这样做)
例如,MD5哈希会加入如果您将其设置为使用ManifestStaticFilesStorage
,则该广告会宣传该行为。
此存储空间的目的是继续提供旧文件,以防万一某些页面仍引用这些文件,例如因为它们被缓存您或第三方代理服务器。此外,如果您想将远期Expires标头应用于已部署的文件加快后续页面访问的加载时间。
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
是为您准备此目录的现成脚本,因此您可以将其直接连接到部署脚本。
在正式版安装中,您要具有永久URL。除非文件内容更改,否则URL不会更改。
这是为了防止客户端从Django打开网页时在其计算机上使用错误版本的CSS或JS文件。 Django staticfiles检测文件更改并相应地更新URL,因此,如果CSS或JS文件更改,则Web浏览器将下载新版本。
通常通过在collectstatic
运行期间将MD5哈希添加到文件名来实现。
编辑:另请参阅多个应用程序的相关答案。
当站点内有多个django应用程序时非常有用。
[collectstatic
然后将在一个地方收集所有应用程序的静态文件-以便可以在生产环境中使用它。