这可能是一个愚蠢的问题,但它只是没有在我的头脑中点击。
在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静态文件可以在很多地方。作为
/static/img/icon.png
使用的文件可以come from many places。默认情况下:FileSystemFinder
将在每个STATICFILES_DIRS
中查找img/icon.png
AppDirectoriesFinder
将在每个INSTALLED_APPS
的static
子文件夹中查找img/icon.png
。这允许像Django Admin这样的库将它们自己的静态文件添加到您的应用程序中。现在:这只在使用DEBUG=1运行
manage.py runserver
时有效。当您上线时,Django进程将不再为静态资产提供服务。使用Django来提供这些服务是低效的,有更多专门的工具专门用于此。相反,你应该这样做:
/static/*
,并将任何其他请求重定向到Django。collectstatic
是一个现成的脚本,可以为您准备此目录,以便您可以将其直接连接到部署脚本。在生产安装中,您希望有持久的url。除非文件内容更改,否则URL不会更改。
这是为了防止客户端在从Django打开网页时在其计算机上使用错误版本的CSS或JS文件。Django staticfiles检测文件更改并相应地更新url,以便在CSS或JS文件更改时,web浏览器下载新版本。
这通常是通过在运行
collectstatic
期间向文件名添加MD5哈希来实现的。编辑:另请参阅多个应用程序的相关答案。
将多个应用程序中的静态文件收集到单个路径中
好吧,一个Django项目可能会使用几个应用程序,所以虽然只有一个
myapp
,但实际上可能是myapp1
,myapp2
等通过将它们从单个应用程序内部复制到单个文件夹中,您可以将前端web服务器(例如nginx)指向该单个文件夹
STATIC_ROOT
,并从单个位置提供静态文件,而不是将web服务器配置为从多个路径提供静态文件。具有ManifestStaticFilesStorage的持久url
关于MD5散列被附加到文件名以进行版本控制的注意事项:它不是
collectstatic
的默认行为的一部分,因为settings.STATICFILES_STORAGE
默认为StaticFilesStorage
(这不起作用)MD5散列将启动,例如,如果您将其设置为使用
ManifestStaticFilesStorage
,则会显示该行为。相关问题 更多 >
编程相关推荐