在docker中找到的Django静态文件找到了findstatic但从服务器返回404

时间:2018-07-28 02:29:55

标签: django docker

我正在开发模式下运行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,这样它就可以在有角容器生成文件后看到它们。

我认为这是一种非常奇怪的行为,但是由于我有一个可行的解决方案,因此我不会继续尝试解决它。​​

1 个答案:

答案 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 字段中定义模板的主管