django 网站对静态文件给出 404 错误

Posted

技术标签:

【中文标题】django 网站对静态文件给出 404 错误【英文标题】:django website is giving 404 error for static files 【发布时间】:2018-06-23 10:14:54 【问题描述】:

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',
        ]

我的静态结构如下所示

我得到 404 的静态数据。尝试了不同的东西,但没有成功。顺便说一句,collectstatic 已经执行了。另一件事是当我在静态文件夹中进行更改时,collectstatic 没有收集任何内容。它说“未修改”。

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


更新 2:

新结构如下

设置是这样的

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 自然返回静态,因为它没有收集。

【问题讨论】:

您是否在 settings.py 的上下文处理器列表中设置了 django.core.context_processors.static? 没有。默认没有 TEMPLATE_CONTEXT_PROCESSORS。 【参考方案1】:

有两个问题:

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")

【讨论】:

是的,一开始真的很困惑。现在我的配置是 STATIC_URL = '/static/' STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static" ) STATICFILES_DIRS = (os.path.join(os.path.dirname(BASE_DIR)) , "static") 和 collectstatic 正在工作。但我猜路径有问题,因为如果它不是 django 的正常行为,它会从项目文件夹中创建新的静态文件夹 @CorpusCallosum 请注意,如果STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static" )STATICFILES_DIRS = (os.path.join(os.path.dirname(BASE_DIR)), "static") 那么STATIC_ROOT 在STATICFILES_DIRS 中!如果BASE_DIRSTATICFILES_DIRS 中,那么任何带有BASE_DIR 的目录都不能成为STATIC_ROOT。请为您的STATIC_ROOT 选择外部 BASE_DIR 的一些随机文件夹,如果情况更好,请尝试。 @CorpusCallosum 添加了一个示例。我希望这有助于您的设置运行。让我知道它是否仍然不起作用。 非常感谢您的努力。我添加了对原始问题的更新。 @CorpusCallosum 很遗憾听到它仍然无法正常工作。你在 INSTALLED_APPS 下有 'django.contrib.staticfiles', 吗?【参考方案2】:

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

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

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

【讨论】:

当我使用 join 时,它说 ?: (staticfiles.E002) STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置。这就是为什么改为字符串连接。

以上是关于django 网站对静态文件给出 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 django 开发中加载静态文件时出现 404 错误

目录“静态”给出 404 错误

Django 项目设置 Debug=False 后静态文件和上传文件404错误问题解决

尝试直接在 Django 中加载静态 url 时收到 404 错误

Django静态文件404

Django:404 模板中的静态文件