是我在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'
我将所有静态文件放在一个文件夹中,在根级别调用static, 当我运行manage.py collectstatic时,我会生成所有静态文件 静态文件目录,但不知怎的,我仍然无法让它运行。
我尝试隔离问题,我正在使用以下模板
<!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" %}
但他们都没有加载
我也尝试过和没有 &#39; whitenoise.runserver_nostatic&#39; 在Django Apps中加载,我保持相同的结果。
任何人都知道我做错了什么?
提前致谢。
答案 0 :(得分:3)
尝试删除此行,
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
答案 1 :(得分:1)
问题在于模板中的某处您引用的静态文件不存在。具体来说,您将一个空字符串传递给static。也许您有{%static some_variable%}之类的行,其中some_variable未定义?
在Django 1.11中,行为已更改,因此错误丢失了丢失的文件。参见:https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage.manifest_strict
如果您修复此参考文献,则一切正常。
下面的问题值得一读。 ValueError at / Missing staticfiles manifest entry for ''
此答案是从https://stackoverflow. com/a/49656053/3001007
复制而来的此外,这里还有一个详尽的答案。 Django Model: ValueError: Missing staticfiles manifest entry for "file_name.ext"
答案 2 :(得分:1)
如果您在Heroku上使用Docker,则这是正确的解决方案(而不是完全删除压缩)。仅仅因为在部署过程中未创建STATIC_ROOT
(而不是普通的Python / Django堆栈)而引发错误。另外,您还必须确保在可能最终提供静态文件的所有测功机上运行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
)(用于缓存)。
答案 3 :(得分:0)
与 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