我对Django的'staticfiles'
应用程序中STATIC_URL和STATIC_ROOT之间的区别感到有些困惑。
我相信我理解STATIC_ROOT
是什么:它本质上是服务器上静态文件所在的位置。 collectstatic
命令将放置从django项目收集的静态文件。 collectstatic
命令会搜索您在STATIC_FINDERS
设置中指定的位置。
然而,STATIC_URL
究竟做了什么?这应该是什么?显然,它旨在设置一些用户可以访问静态文件的东西。但它与STATIC_ROOT
的关系是什么?
为什么STATIC_URL
的默认值只是/static/
? STATIC_URL
必须能够引用STATIC_ROOT
吗?
答案 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)
const
是STATIC_ROOT
命令收集所有资产的地方。其内容直接包含collectstatic
(来自他们自己的INSTALLED_APPS
文件夹)中列出的所有应用程序中的所有静态资源以及STATICFILE_DIRS
中提到的任何文件位置。
一旦你收集了所有这些资产,为了让django创建网址,你需要告诉它这些资产的基本URL是什么,这是static
设置,它必须始终以斜杠结尾。