django网站为静态文件提供404错误

时间:2018-01-14 16:48:00

标签: python django django-staticfiles django-settings

在Django 2中遇到静态文件问题。

        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        TEMPLATE_DIR = os.path.join(BASE_DIR, "templates")
        STATIC_URL = '/static/'
        STATIC_ROOT = BASE_DIR + '/static/'
        STATICFILES_DIR = [
              (BASE_DIR + "static/"),
        ]


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

我的静态结构如下所示

enter image description here

我得到404静力学。尝试了不同的事情但没有成功。 btw collectstatic已经完成了。另一件事是当我在静态文件夹中进行更改时,collectstatic不会收集任何内容。它说“未经修改”。

我是Django的新手。感谢您的帮助。

更新2:

新结构如下 enter image description here

,设置就像

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static' )
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static_files')
]

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

当我尝试收集静止时,没有变化。好像不收集。并且404自然地返回静态,因为它没有收集。

2 个答案:

答案 0 :(得分:2)

有两个问题:

1。是Digitiain在his answer中指出的语法错误:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

2。您无法将STATIC_ROOT中的路径添加到STTATICFILES_DIRS。因此,如果您的STTATICFILES_DIRS如上所示,则STATIC_ROOT不能为os.path.join(BASE_DIR, "static")

第一点应该是相当清楚的。第二个也在一开始就困惑了我。但实际上它很有道理:

STATICFILES_DIRS中,您告诉django去哪里寻找静态文件。这主要不是为了服务他们,而是为了收集它们!关键是在生产服务器上,django不应该服务于静态文件,这个任务应该由Web服务器处理。 Check the docs for details.我的想法是你运行命令python manage.py collectstatic,django将遍历STATICFILES_DIRS中的所有路径,收集静态文件并将它们放入...... - 完全正确! - 在STATIC_ROOT文件夹中。现在很明显为什么STATIC_ROOT文件夹不能真正成为STATICFILES_DIRS的一部分,因为这意味着django需要将文件夹放入其中。同样,这是一个高效的服务器。在开发过程中,django可以在没有Web服务器帮助的情况下处理静态文件,here更多来自文档。

我希望这有助于澄清STATICFILES_DIRSSTATIC_ROOT之间的关系。底线:为STATIC_ROOT选择不同的路径,你应该好好去!

作为示例,您可以拥有如下项目结构:

base_dir/
  - static/
      - css/
      - js/
      - ...
  - static_collected/
  - ...

然后定义:

是有效的
# settings.py
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
STATIC_ROOT = os.path.join(BASE_DIR, "static_collected")

答案 1 :(得分:1)

这可能是一个红色的鲱鱼,但在Django docs中,设置相对于BASE_DIR的路径的语法包括os.path.join,所以你的看法如下:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

编辑:我也注意到你引用了DIR而不是DIRS,这可能会引起悲伤。与templates同上。