我正在开发模式下运行Django / Angular / Docker构建,将Angular构建安装在Django容器中以用作静态内容。但是,我得到的所有静态文件都为404。
奇怪的是,运行python3 manage.py findstatic index.html
可以正确找到文件。
docker-compose -f docker-compose.yml run backend python3 manage.py findstatic index.html
Found 'index.html' here:
/django/static/index.html
我的设置非常简单
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static/')
]
我的网址-
from django.contrib.staticfiles.views import serve
# root is served by angular index
url(r'^$', serve, kwargs={'path': 'index.html'}),
我想知道如何用findstatic找到它,但是执行HTTP请求时找不到?
这将返回带有以下消息的404
'index.html' could not be found
编辑:
因此,我拆解了FileSystemFinder,并意识到os.path.exists(path)
调用即使对于有效位置也失败了。我可以运行os.listdir('/app')
并获得结果
['app', '__init__.py', '__pycache__', 'setup.py', 'static', 'applications', 'manage.py', 'conf', 'wsgi.py', 'media']
这显示了静态目录,但是当我运行os.listdir('/app/static')
时,出现文件未找到异常。如果我直接在python终端中运行命令,则该命令可以运行,但在django应用程序中却无法运行。我不确定os
命令会导致什么差异。
另一个编辑:
显然,默认情况下,Django将不会在文件系统上看到新文件。我最终使用了WhiteNoise,这样它就可以在有角容器生成文件后看到它们。
我认为这是一种非常奇怪的行为,但是由于我有一个可行的解决方案,因此我不会继续尝试解决它。
答案 0 :(得分:0)
html文件不是静态文件的成员。您应该为django定义模板目录,并在其中放置html文件。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
在 DIRS 字段中定义模板的主管