Django没有看到所有STATIC_DIRS

时间:2017-03-09 22:22:13

标签: django

在开发模式下,我的django应用程序正在从其中一个STATICFILES_DIRS提供静态文件,而不是另一个。

这是我在settings.py文件中的代码:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'bower_components'), # OK
    os.path.join(BASE_DIR, 'practice_custom'),  # Not OK
]

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
]

找到 bower_components 中的文件,但 practice_custom 中的文件不是。两个目录都在同一个地方(顶层)。如果我将 bower_components 目录重命名为 bower_componentszzzzzz ,则找不到文件,这意味着他们是通过staticfiles应用程序找到的。

FileSystemFinder似乎也在工作,实际上我将print语句放在find()方法的代码中( ---寻找:),它显示了提供的路径,如你可以看到它们的格式相同,但是会产生404。

---looking for: practice_custom/xyz/style.css
[09/Mar/2017 21:55:11] "GET /static/practice_custom/xyz/style.css HTTP/1.1" 404 1732
---looking for: bower_components/c3/c3.min.css
[09/Mar/2017 21:55:11] "GET /static/bower_components/c3/c3.min.css HTTP/1.1" 200 2043

有什么想法吗?

编辑:

在检查FileSystemFinder.find_location()时,我看到它正在搜索 bower_components / bower_components ,然后在顶层的 bower_components 目录中找到了一个峰值,发现它确实存在确实有一个名为 bower_components 的子目录,这是唯一有效的原因!

虽然当我运行collectstatic时,我得到 static / bower_components / bootstrap 等...正如我期望看到的那样。

/manage.py
/bower_components/bower_components/bootstrap
/static/bower_components/bootstrap
/...

所以我想,问题是为什么会这样做?!

1 个答案:

答案 0 :(得分:1)

由于Django行为在每个静态目录中使用了一个命名空间。它希望您在每个静态文件夹中都有一个唯一的子目录,以避免名称冲突。

  

静态文件命名空间

     

现在我们可以将我们的静态文件直接放在my_app / static /中(而不是创建另一个my_app子目录),但这实际上是个坏主意。 Django将使用它找到的名称匹配的第一个静态文件,如果在不同的应用程序中有一个具有相同名称的静态文件,Django将无法区分它们。我们需要能够将Django指向正确的,并且确保这一点的最简单方法是通过命名它们。也就是说,将这些静态文件放在为应用程序本身命名的另一个目录中。

https://docs.djangoproject.com/en/howto/static-files/

所以如果你有:

/static/bower_components/bootstrap
/static/xyz/style.css
/static/example_root.js

然后您的静态文件将在以下位置提供:

plt.xlim