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

时间:2016-06-09 03:16:18

标签: python django django-staticfiles

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

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

然而,STATIC_URL究竟做了什么?这应该是什么?显然,它旨在设置一些用户可以访问静态文件的东西。但它与STATIC_ROOT的关系是什么?

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

3 个答案:

答案 0 :(得分:11)

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

  

<强> STATIC_ROOT:

     

collectstatic将收集静态文件以进行部署的目录的绝对路径。

     

<强> STATIC_URL

     

默认值:无

     

引用STATIC_ROOT中的静态文件时使用的网址。

     

示例:"/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/,而是没有,您可以在文档中看到。并且,它不必引用STATIC_ROOT,因为它不依赖于它(如上例所示)。

答案 1 :(得分:2)

STATIC_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)

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

我的STATIC_ROOT定义为:

STATIC_ROOT = '/%s/' % STATIC_S3_PATH

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

答案 2 :(得分:0)

constSTATIC_ROOT命令收集所有资产的地方。其内容直接包含collectstatic(来自他们自己的INSTALLED_APPS文件夹)中列出的所有应用程序中的所有静态资源以及STATICFILE_DIRS中提到的任何文件位置。

一旦你收集了所有这些资产,为了让django创建网址,你需要告诉它这些资产的基本URL是什么,这是static设置,它必须始终以斜杠结尾。