Django中的STATIC_URL和STATIC_ROOT有什么区别?

29

我对Django的'staticfiles'应用程序中STATIC_URLSTATIC_ROOT之间的区别感到有些困惑。

我认为我理解了STATIC_ROOT的意思:它基本上是服务器上静态文件所在的位置,collectstatic命令将从您的Django项目中收集的静态文件放置在该位置。 collectstatic命令在您在STATIC_FINDERS设置中指定的位置搜索。

然而,STATIC_URL到底是做什么的?这应该设置为什么?显然,它的目的是设置某些东西,以便用户可以访问静态文件。但是,它与STATIC_ROOT有什么关系?

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

3个回答

36

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

STATIC_ROOT:

collectstatic将收集用于部署的静态文件的目录的绝对路径。

STATIC_URL

默认值:None

用于引用位于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,因为它不依赖于它(如上面的示例所示)。


6
很好的回答。我需要补充一点,即在模板中使用{{STATIC_URL}}不被推荐。应该改用{% load static %} ... {% static 'css/main.css' %} 。详情请参见:http://staticfiles.productiondjango.com/blog/stop-using-static-url-in-templates/ - Niko Pasanen
但是我刚试了一下,发现我可以设置 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 工作原理的理解。这怎么可能呢? - ruslaniv
@ruslaniv 我也有同样的疑问。你找到答案了吗? - Navdeep
@Navdeep 不好意思,还没有。 - ruslaniv

7

STATIC_URL是静态文件的URL前缀或地址,主要用于Django模板中的static方法。如需更多信息,请参阅此文档

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。


4

STATIC_ROOT 是所有静态资源将被 collectstatic 命令收集的地方。该目录的内容包含在 INSTALLED_APPS 列表中列出的所有应用程序(来自它们自己的 static 文件夹)和任何在 STATICFILE_DIRS 中提到的文件位置的静态资产。

当您收集所有这些资产时,为了让 Django 创建 URL,您需要告诉它这些资产的基本 URL,即 STATIC_URL 设置,并且它必须以斜杠结尾。


您介意看一下 https://dev59.com/floU5IYBdhLWcg3wM04H?rq=1#comment117311502_37717024 吗? - ruslaniv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接