Django 中的 STATIC_URL 和 STATIC_ROOT 有啥区别?
Posted
技术标签:
【中文标题】Django 中的 STATIC_URL 和 STATIC_ROOT 有啥区别?【英文标题】:What's the difference between STATIC_URL and STATIC_ROOT in Django?Django 中的 STATIC_URL 和 STATIC_ROOT 有什么区别? 【发布时间】:2016-10-09 12:43:48 【问题描述】:对于 Django 的 'staticfiles'
应用程序中的 STATIC_URL 和 STATIC_ROOT 之间的区别,我有些困惑。
我相信我了解STATIC_ROOT
是什么:它本质上是服务器上的位置,静态文件的collectstatic
命令将放置从您的django 项目收集的静态文件。 collectstatic
命令搜索您在STATIC_FINDERS
设置中指定的位置。
但是,STATIC_URL
到底是做什么的?这应该设置成什么?显然,它的目的是设置一些东西,以便用户可以访问静态文件。但是它和STATIC_ROOT
是什么关系呢?
为什么STATIC_URL
的默认值就是/static/
? STATIC_URL
是否必须能够引用 STATIC_ROOT
?
【问题讨论】:
【参考方案1】:就像你提到的,从文档中很清楚:
STATIC_ROOT:
collectstatic
将收集用于部署的静态文件的目录的绝对路径。STATIC_URL
默认:无
引用位于
STATIC_ROOT
中的静态文件时使用的 URL。例如:
"/static/"
或"http://static.example.com/"
STATIC_ROOT
只是收集静态文件的目录的路径,STATIC_URL
是提供这些静态文件的 URL。
而且,正如您在示例中看到的,您可以将STATIC_URL
定义为子域"http://static.example.com/"
,并且当您在模板中使用它时:
<link rel="stylesheet" href=" STATIC_URL css/base.css" type="text/css" />
它将被视为:
<link rel="stylesheet" href="http://static.example.com/css/base.css" type="text/css" />
但是,如果STATIC_URL
只是/static/
,那么上面的链接将指向:
<link rel="stylesheet" href="/static/css/base.css" type="text/css" />
而且,由于此 href
以 /
开头,它将附加您的域以访问静态文件:http://yourdomain/static/css/base/css
为什么
STATIC_URL
的默认值只是/static/
? STATIC_URL 是否必须能够引用STATIC_ROOT
?
STATIC_URL
的默认值不是/static/
,而是 None ,正如您在文档中看到的那样。而且,它不必引用STATIC_ROOT
,因为它不依赖于它(如上例所示)。
【讨论】:
很好的答案。我必须补充一点,不建议在模板中使用 STATIC_URL。请改用 % load static % ... % static 'css/main.css' %。 staticfiles.productiondjango.com/blog/… 但正如我刚刚尝试并发现我可以设置STATIC_URL = '/static/abcd/'
一样,基本上只是一个任意路径,Django 仍然可以正确获取静态文件。例如,它提供来自 <link rel="stylesheet" href="/static/abcd/css/app.css" type="text/css">
的 CSS 文件,如 DevTools 中所示,尽管我的系统上没有这样的目录。我的 CSS 文件位于 common_static/css/app.css
并收集到 static/css/app.css
。所以这对我对STATIC_URL
工作原理的理解产生了很大的影响。这怎么可能?【参考方案2】:
STATIC_ROOT
是collectstatic
命令收集所有资产的地方。它的内容直接包含来自INSTALLED_APPS
中列出的所有应用程序(来自它们自己的static
文件夹)和STATICFILE_DIRS
中提到的任何文件位置的所有静态资产。
一旦你收集了所有这些资产,为了让 django 创建 url,你需要告诉它这些资产的基本 URL 是什么,这就是 STATIC_URL
设置,它必须始终以斜杠结尾。
【讨论】:
你介意看看***.com/questions/37716200/… 吗?【参考方案3】:STATIC_URL
只是添加到静态文件的前缀或 url,主要由 Django 模板中的 static
方法使用。欲了解更多信息,请阅读this。
STATIC_ROOT
是运行collectstatic
时部署静态文件的目录或位置。
因此,当您将 STATIC_URL
定义为 /static/
时,您的用户会从 /static/file-name.example
(您服务器上的相对 URL)请求静态文件。
如果您已自定义 collectstatic
以将静态文件部署到另一台服务器,则可以将 STATIC_URL
设置为 https://static.example.org/
。
然后,您可以通过 https://static.example.org/filename.ext
访问您的文件。
我的另一个示例是使用 Boto S3 库将静态和媒体内容上传到 Amazon S3。我的STATIC_URL
看起来像这样:
STATIC_URL = '//%s/%s/' % (CLOUDFRONT_DOMAIN, STATIC_S3_PATH)
它会构造一个像 //mycloudfront.whatever/static/
这样的静态 URL 前缀,因此我们的 CDN 将为用户提供文件。
我的STATIC_ROOT
然而被定义为:
STATIC_ROOT = '/%s/' % STATIC_S3_PATH
...因为我需要将我的内容上传到 Amazon S3 而不 Cloudfront。
【讨论】:
以上是关于Django 中的 STATIC_URL 和 STATIC_ROOT 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用 django 将 STATIC_URL 传递给文件 javascript
django STATIC_URL STATIC_ROOT STATICFILES_DIRS的区别
Django 404 上的静态文件,同时设置了 static_root 和 static_url