Django中STATIC_URL和STATIC_ROOT之间有什么区别?

Izz*_*zzo 14 python django django-staticfiles

我对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

AKS*_*AKS 14

就像你提到的那样,从文档中可以很清楚地看出:

STATIC_ROOT:

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

STATIC_URL

默认值:无

引用位于的静态文件时使用的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" />
Run Code Online (Sandbox Code Playgroud)

它将被视为:

<link rel="stylesheet" href="http://static.example.com/css/base.css" type="text/css" />
Run Code Online (Sandbox Code Playgroud)

但是,如果STATIC_URL恰到好处/static/,上述链接将指向:

<link rel="stylesheet" href="/static/css/base.css" type="text/css" />
Run Code Online (Sandbox Code Playgroud)

并且,因为这href开始/它将附加您的域以访问静态文件: http://yourdomain/static/css/base/css


为什么STATIC_URL简单的默认值/static/?STATIC_URL必须能够参考STATIC_ROOT吗?

默认值STATIC_URL不是,/static/但您可以在文档中看到.并且,它不必引用,STATIC_ROOT因为它不依赖于它(如上例所示).

  • 很好的答案。我必须补充一点,不建议在模板中使用 {{STATIC_URL}}。使用 {% load static %} ... {% static 'css/main.css' %} 代替。http://staticfiles.productiondjango.com/blog/stop-using-static-url-in-templates/ (4认同)

A. *_*arr 7

STATIC_URLstatic只是添加到静态文件前面的前缀或 url,主要由 Django 模板中的方法使用。欲了解更多信息,请阅读此内容

STATIC_ROOT是运行时部署静态文件的目录或位置collectstatic

因此,当您STATIC_URL定义为时,您的用户将从(服务器上的相对 URL) /static/请求静态文件。/static/file-name.example

如果您已自定义collectstatic将静态文件部署到另一台服务器,则可以设置STATIC_URLhttps://static.example.org/.

然后,您可以在 访问您的文件https://static.example.org/filename.ext

我的另一个例子是使用 Boto S3 库将静态和媒体内容上传到 Amazon S3。我的STATIC_URL看起来像这样:

STATIC_URL = '//%s/%s/' % (CLOUDFRONT_DOMAIN, STATIC_S3_PATH)
Run Code Online (Sandbox Code Playgroud)

它构建了一个像这样的静态 URL 前缀,//mycloudfront.whatever/static/以便用户可以从我们的 CDN 获得文件。

然而我的STATIC_ROOT定义是:

STATIC_ROOT = '/%s/' % STATIC_S3_PATH
Run Code Online (Sandbox Code Playgroud)

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