2017-03-09 54 views
1

在发展模式,我的Django应用程序从STATICFILES_DIRS的*一个服务静态文件,而不是其他。的Django没有看到所有STATIC_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应用程序中。我们在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我得到静态/ bower_components /引导等...因为我希望看到。

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

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

+0

什么是你的Django和Python版本? – rodorgas

+0

Django是1.9.5,Python是3.5 – andyhasit

回答

1

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

静态文件的命名空间

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

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

所以,如果您有:

├── django_app 
│   ├── practice_custom 
│   │   ├── example_root.js 
│   │   ├── xyz 
│   │ │   ├── style.css 
│   ├── bower_components 
│   │   ├── bower_components 
│   │ │   ├── bootstrap 

那么你的静态文件将可在:

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

我已经读过,但没有把它们放在一起。感谢你。 – andyhasit