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_DIRS
和STATIC_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_DIR
在STATICFILES_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 项目设置 Debug=False 后静态文件和上传文件404错误问题解决