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 仍然可以正确获取静态文件。例如,它提供来自 &lt;link rel="stylesheet" href="/static/abcd/css/app.css" type="text/css"&gt; 的 CSS 文件,如 DevTools 中所示,尽管我的系统上没有这样的目录。我的 CSS 文件位于 common_static/css/app.css 并收集到 static/css/app.css。所以这对我对STATIC_URL 工作原理的理解产生了很大的影响。这怎么可能?【参考方案2】:

STATIC_ROOTcollectstatic 命令收集所有资产的地方。它的内容直接包含来自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

Django中的静态文件导入

如何使 STATIC_URL 在外部 JS 文件(Django)中工作

为啥更改我的“STATIC_URL”设置会改变我的 Django 应用程序是不是正常工作?