这可能是一个愚蠢的问题,但它并没有点击我的脑袋.
在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的项目可以使用多个应用程序,因此虽然你只有一个myapp
,它实际上可能是myapp1
,myapp2
等
通过将它们从单个应用程序内部复制到单个文件夹中,您可以将前端Web服务器(例如nginx)指向该单个文件夹STATIC_ROOT
并从单个位置提供静态文件,而不是将Web服务器配置为从多个路径提供静态文件.
关于MD5哈希附加到版本控制文件名的说明:它不是默认行为的一部分collectstatic
,settings.STATICFILES_STORAGE
默认为StaticFilesStorage
(不执行此操作)
MD5哈希将启动,例如,如果您将其设置为使用ManifestStaticFilesStorage
,该行为广告.
此存储的目的是在某些页面仍然引用这些文件的情况下继续提供旧文件,例如,因为它们是由您或第三方代理服务器缓存的.此外,如果您希望将远期的Expires标头应用于已部署的文件,以加快后续页面访问的加载时间,这将非常有用.
Django静态文件可以在很多地方.提供的文件/static/img/icon.png
可能来自许多地方.默认情况下:
FileSystemFinder
将寻找img/icon.png
每一个STATICFILES_DIRS
,
AppDirectoriesFinder
将img/icon.png
在static
你的每个子文件夹中查找INSTALLED_APPS
.这允许像Django Admin这样的库将自己的静态文件添加到您的应用程序中.
现在:这仅在您manage.py runserver
使用DEBUG = 1 运行时才有效.当你上线时,Django进程将不再提供静态资产.使用Django来提供这些服务是低效的,还有更专门的工具.
相反,你应该做这样的事情:
查找每个应用程序的所有静态文件
构建一个包含所有目录的目录
将它们上传到某处(static
您的网络服务器上的某个目录或第三方文件存储)
配置您的网络服务器(如nginx)/static/*
直接从该目录提供服务,并将任何其他请求重定向到Django.
collectstatic
是一个现成的脚本,可以为您准备此目录,以便您可以将其直接连接到部署脚本.
在生产安装中,您希望拥有永久URL.除非文件内容发生更改,否则URL不会更改.
这是为了防止客户端在从Django打开网页时在其计算机上安装错误版本的CSS或JS文件.Django staticfiles会检测文件更改并相应地更新URL,这样如果CSS或JS文件发生更改,Web浏览器会下载新版本.
这通常通过在collectstatic
运行期间向文件名添加MD5哈希来实现.
编辑:另请参阅多个应用程序的相关答案.
当网站中有多个django应用程序时,它很有用.
collectstatic
然后将在一个地方收集来自所有应用程序的静态文件 - 以便它可以在生产环境中提供.