Django 不加载静态文件 ValueError("缺少 '%s' 的静态文件清单条目" % clean_name)



是我在 Django 中的第一个应用程序,我正在尝试为生产准备我的 Django (2.0( 应用程序,但我无法使用 WhiteNoise 正确加载静态文件

我一直在日志中出现下一个错误

ValueError("Missing staticfiles manifest entry for '%s'" % clean_name)
ValueError: Missing staticfiles manifest entry for 'css/inicio.css'
[02/Jun/2018 14:40:37] ERROR [django.server:124] "GET /participation/prueba HTTP/1.1" 500 27

我有以下 settings.py

...
DEBUG=False
DJANGO_APPS = ['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
#Delete for development whitenoise.runserver_nostatic
'whitenoise.runserver_nostatic',
'django.contrib.staticfiles',
'django.contrib.sites'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')
STATICFILES_DIRS = (
(os.path.join(BASE_DIR, 'static')),
)
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

我将所有静态文件都放在一个称为根级静态的文件夹中, 当我运行 collectstatic manage.py 时,我会生成所有静态文件 静态文件目录,但不知何故我仍然无法让它运行。

我尝试隔离问题,并且使用以下模板

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<link rel="stylesheet" href="{% static "css/inicio.css" %}">
</head>
<body>

{% for categoria in categoria_list %}
<p>
{{ categoria.titulo }}
</p>
{% endfor %}

</body>
</html>

我已经尝试将 href 的路径更改为

{% static "/css/inicio.css" %}
{% static "static/css/inicio.css" %}

但是他们都没有让它加载

我也尝试过有和没有 "whitenoise.runserver_nostatic" 加载在 Django 应用程序中,我一直有相同的结果。

有人知道我做错了什么吗?

提前谢谢。

尝试删除此行,

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

来源:https://stackoverflow.com/a/32347324/2596187

问题是模板中的某个地方引用了一个不存在的静态文件。具体来说,您将空字符串传递给静态。也许你有一行像 {% 静态some_variable %} 这样some_variable未定义?

在 Django 1.11 中,行为发生了变化,因此在丢失的文件上抛出错误。请参阅:https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage.manifest_strict

如果您修复此引用,那么一切应该都可以正常工作。

下面的SO问题值得一读。 值错误/缺少 '' 的静态文件清单条目

这个答案是从 https://stackoverflow 复制而来的。 COM/A/49656053/3001007

此外,这里有一个详细的答案。 Django 模型:ValueError:缺少"file_name.ext"的静态文件清单条目

如果你在 Heroku 上使用 Docker,这是正确的解决方案(而不是完全删除压缩(。引发此错误仅仅是因为在部署期间未创建STATIC_ROOT(与普通的 Python/Django 堆栈不同(。此外,您必须确保在所有可能最终提供静态文件的dyno上运行collectstatic

我通过将所有内容烘焙到基本 Docker 映像中来解决此问题。在您的 Dockerfile 中(假设您的STATIC_ROOT/app/static(:

[...]
RUN mkdir -p /app/static
RUN python manage.py collectstatic --no-input
[...]

这将收集所有静态文件创建 Whitenoise 用来映射正常文件名的清单文件(例如css/inicio.css( 到散列文件名(例如css/inicio.bf12af51cd.css((用于缓存(。

与 Marco 的答案类似,如果要部署到 Azure 应用服务。 将启动文件修改为:

python manage.py migrate
python manage.py collectstatic
gunicorn --bind=0.0.0.0 --timeout 30 --max-requests 500 --max-requests-jitter 10  <appname>.wsgi

最新更新