Django 中 STATIC_URL 和 STATIC_ROOT 有什么区别?

What's the difference between STATIC_URL and STATIC_ROOT in Django?

对于 Django 的 'staticfiles' 应用程序中 STATIC_URL 和 STATIC_ROOT 之间的区别,我有些困惑。

我相信我理解 STATIC_ROOT 是什么:它本质上是服务器上的位置,staticfiles 的 collectstatic 命令将放置从您的 django 项目收集的静态文件。 collectstatic 命令在您在 STATIC_FINDERS 设置中指定的位置搜索。

然而,STATIC_URL 到底是做什么的?这应该设置成什么?显然,它旨在进行设置,以便用户可以访问静态文件。但是和STATIC_ROOT有什么关系呢?

为什么 STATIC_URL 的默认值只是 /static/STATIC_URL 是否必须能够引用 STATIC_ROOT

正如您提到的,从文档中可以清楚地看出:

STATIC_ROOT:

The absolute path to the directory where collectstatic will collect static files for deployment.

STATIC_URL

default: None

URL to use when referring to static files located in STATIC_ROOT.

Example: "/static/" or "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 将指向:

<link rel="stylesheet" href="/static/css/base.css" type="text/css" />

并且,由于此 href/ 开头,它将附加您的域以访问静态文件:http://yourdomain/static/css/base/css


Why is the default value of STATIC_URL simply /static/ ? Does STATIC_URL have to be able to reference STATIC_ROOT?

STATIC_URL 的默认值不是 /static/,而是 None,如您在文档中所见。而且,它不必引用 STATIC_ROOT 因为它不依赖于它(如上例所示)。

STATIC_URL is simply the prefix or url that is prepended to your static files and is used by the static method in Django templates mostly. For more info, read 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)

它构建了一个像这样的静态 URL 前缀 //mycloudfront.whatever/static/ 因此用户将从我们的 CDN 提供文件。

然而我的 STATIC_ROOT 定义为:

STATIC_ROOT = '/%s/' % STATIC_S3_PATH

...因为我需要将我的内容上传到 Amazon S3 而不是 Cloudfront。

STATIC_ROOTcollectstatic 命令将收集您所有资产的地方。此内容直接包含 INSTALLED_APPS 中列出的所有应用程序(来自它们自己的 static 文件夹)的所有静态资产以及 STATICFILE_DIRS.

中提到的任何文件位置

收集完所有这些资产后,为了让 django 创建 url,您需要告诉它这些资产的基础 URL 是什么,即 STATIC_URL 设置,它必须总是以斜杠结尾。