【问题标题】:Difference between static STATIC_URL and STATIC_ROOT on DjangoDjango 上的静态 STATIC_URL 和 STATIC_ROOT 之间的区别
【发布时间】:2012-01-31 01:20:36
【问题描述】:

我被static root弄糊涂了,想澄清一下。

要在 Django 中提供静态文件,settings.pyurls.py 中应包含以下内容:

import os
PROJECT_DIR=os.path.dirname(__file__)

1。应该收集静态文件的目录的绝对路径

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2。静态文件的 URL 前缀

STATIC_URL = '/static/'

3。静态文件的其他位置

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

...在urls.py 中添加以下行:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4。我们也使用python manage.py collectstatic

问题:

  1. 谁能向我解释一下工作流程:理想情况下应该如何做。到目前为止,我将上面的代码 sn-ps 复制/粘贴到它们指定的位置,并继续在静态目录中创建新文件,它就可以工作了。然而,在我的settings.STATIC_ROOT 中,我指向了一个不同的目录。

  2. 如果有人能解释每个设置的工作流程,那就太好了:如何收集和管理文件,以及遵循什么好的做法。

谢谢。

【问题讨论】:

  • 您能否澄清一下“解释工作流程”的含义?如果您在第 3 部分中进行开发,您的 url 模式也应该以条件为条件。您可以通过添加 if settings.DEBUG: 来做到这一点 django 不太擅长提供静态媒体,这应该留给真正的网络服务器。
  • 嗨@user993563 我什至无法在几个论坛中找到我想要的解决方案。但是您的问题清楚地解释了谢谢伙计...干得好...
  • 很好的解释,谢谢

标签: django django-urls django-staticfiles


【解决方案1】:

STATIC_ROOT

./manage.py collectstatic 将收集用于部署的静态文件的目录的绝对路径。 示例:STATIC_ROOT="/var/www/example.com/static/"

现在命令./manage.py collectstatic 会将所有静态文件(即在您的应用程序的静态文件夹中,所有路径中的静态文件)复制到目录/var/www/example.com/static/。现在你只需要在 apache 或 nginx..etc 上提供这个目录。

STATIC_URL

URLSTATIC_ROOT 目录下的静态文件被服务(通过 Apache 或 nginx..etc)。 示例:/static/http://static.example.com/

如果您设置STATIC_URL = 'http://static.example.com/',那么您必须通过 apache 或 nginx 在 url 'http://static.example.com/' 提供 STATIC_ROOT 文件夹(即 "/var/www/example.com/static/")(以便您可以引用静态文件 '/var/www/example.com/static/jquery.js''http://static.example.com/jquery.js' )

现在在您的 django 模板中,您可以通过以下方式引用它:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

将呈现:

<script src="http://static.example.com/jquery.js"></script>

【讨论】:

  • 你的例子和这个有什么区别:href="{% static "jquery.js" %}"
  • @macdonjo {{ STATIC_URL }}jquery.js{% static "jquery.js" %} 是相同的。即两者都将返回/static/jquery.jsNewer django版本推荐使用{% static "jquery.js" %},但需要加载模板标签,即{% load staticfiles %}。在older django 版本推荐{{STATIC_URL}}
  • 我明白了。我试图找到一个错误,该错误导致我的大多数模板加载除了一个页面之外的样式表。我将其更改为static 方法而不是STATIC_URL 方法,并且该错误消失了。很好地呼吁基于版本的建议。
  • 但正如我刚刚尝试并发现我可以设置STATIC_URL = '/static/abcd/',基本上只是一个任意路径,Django 仍然可以正确获取静态文件。例如,它提供来自 &lt;link rel="stylesheet" href="/static/abcd/css/app.css" type="text/css"&gt; 的 CSS 文件,如 DevTools 中所示,尽管我的系统上没有这样的目录。我的 CSS 文件位于 common_static/css/app.css 并收集到 static/css/app.css。因此,这对我对 STATIC_URL 工作原理的理解造成了很大的影响。这怎么可能?
  • @RusI STATIC_URL 是 Django 创建的 url,它不是目录。
【解决方案2】:

STATICFILES_DIRS:您可以将项目的静态文件保存在这里,例如您的模板使用的那些。

STATIC_ROOT:留空,当你做manage.py collectstatic时,它会搜索你系统上的所有静态文件并将它们移动到这里。您的静态文件服务器应该映射到该文件夹​​,无论它位于何处。运行 collectstatic 后查看,你会发现 django 构建的目录结构。

--------编辑----

正如@DarkCygnus 所指出的,STATIC_ROOT 应该指向文件系统上的一个目录,该文件夹应该是空的,因为它将由 Django 填充。

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATIC_ROOT = '/opt/web/project/static_files'

--------结束编辑-----

STATIC_URL: '/static/' 通常没问题,它只是静态文件的前缀。

【讨论】:

  • 这里是1.3中静态文件管理的链接docs.djangoproject.com/en/1.3/howto/static-files
  • STATICFILES_DIRS 应该作为静态文件的附加目录。如果您将所有 css/js/images 放入 APP_NAME/static/APP_NAME 文件夹,则无需指定 STATICFILES_DIRS
  • 感谢您的回答,关于将 STATIC_ROOT 留空,我实际上必须在运行 collectstatic 命令之前在settings.py 中指定它(通过执行STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles'))。
  • 嗯,我知道这很容易产生误导。我把它留空的意思是通常一开始是空的,里面没有文件。我将更新答案以消除混淆。
【解决方案3】:

以上所有答案都有帮助,但没有一个能解决我的问题。在我的生产文件中,我的 STATIC_URL 是 https://&lt;URL&gt;/static,我在 dev settings.py 文件中使用了相同的 STATIC_URL。

这会导致 django/conf/urls/static.py 中的静默失败。

测试elif not settings.DEBUG or '://' in prefix: 拾取 URL 中的 '//' 并且不添加静态 URL 模式,导致找不到静态文件。

如果 Django 吐出一条错误消息指出您不能将 http(s)://DEBUG = True 一起使用,那将是周到的

我必须将 STATIC_URL 更改为 '/static/'

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2021-07-31
    • 2014-06-20
    • 1970-01-01
    • 2012-10-03
    • 2010-10-30
    • 2014-07-24
    • 2014-04-30
    • 2010-10-31
    相关资源
    最近更新 更多