我正在尝试从Django 1.9.7迁移到Django 1.11.5。我有三个不同的django应用程序,它们在包和设置方面几乎相同。我已将它们中的所有三个部署到一个Web服务器,两个应用程序正在运行,没有任何问题,但第三个让我很头疼 - 我一直得到这个错误:
ValueError at / Missing staticfiles manifest entry for ''
以下是settings.py
中最相关的设置:
# -*- coding: utf-8 -*-
from settings import *
SECRET_KEY = '***'
SITE_ID = 3
ALLOWED_HOSTS = [
'localhost',
'127.0.0.1',
'.example.com',
'.example.com.',
]
INSTALLED_APPS += (
'storages',
'example',
'example2',
'el_pagination',
'debug_toolbar',
)
ROOT_URLCONF = 'example.urls'
WSGI_APPLICATION = 'example.wsgi.application'
DEFAULT_FROM_EMAIL = 'web@example.com'
MANAGERS = ADMINS
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'DEFAULT_MIDDLEWARE_ALIAS': 'default',
'DEFAULT_MIDDLEWARE_SECONDS': '300',
'DEFAULT_MIDDLEWARE_KEY_PREFIX': '',
}
}
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.SHA1PasswordHasher',
)
#AWS_HEADERS = { # see http://developer.yahoo.com/performance/rules.html#expires
# 'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
# 'Cache-Control': 'max-age=94608000',
#S }
# AMAZON S3 & CLOUDFRONT SERVING MEDIA FILES
AWS_S3_HOST = 's3.eu-central-1.amazonaws.com'
AWS_STORAGE_BUCKET_NAME = '***'
AWS_CLOUDFRONT_DOMAIN = '***.cloudfront.net'
AWS_ACCESS_KEY_ID = "***"
AWS_SECRET_ACCESS_KEY = "***"
MEDIAFILES_LOCATION = 'example/media'
MEDIA_ROOT = '/%s/' % MEDIAFILES_LOCATION
MEDIA_URL = '//%s/%s/' % (AWS_CLOUDFRONT_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'example.custom_storages.MediaStorage'
# WHITENOISE SERVING STATIC FILES
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATIC_ROOT = os.path.join(BASE_DIR, '***/static/example')
STATIC_URL = '/static/'
我不知道为什么我收到此错误,因为与其他两个定期运行的应用程序相比,我没有做任何不同(部署时)。设置几乎相同!我也尝试清空.css文件,这样我就可以抛弃css文件指向不存在的文件的可能性,但它没有帮助。我已经更新了我的网站正在使用的所有软件包。 这个应用程序在Django 1.9.7下正常工作,但我无法在1.11.5下工作。
编辑 - 我如何修复此问题?
感谢@ evansd的回答,我找到了问题!在我的一个模板中,我有这个代码搞砸了整个事情:
{% for num in numbers %}
<li>
<img src="{% static ''%}img/header/{{num}}.jpg" alt="image {{num}}"/>
</li>
{% endfor %}
我已将其更改为:
{% for num in numbers %}
<li>
<img src="{% static 'img/header/'|addstr:num|addstr:'.jpg' %}" alt="image {{num}}">
</li>
{% endfor %}
在此修复之后一切正常!对于自定义addstr模板标记,请查看this answer。
答案 0 :(得分:3)
问题是模板中的某个地方引用了一个不存在的静态文件。具体来说,您将空字符串传递给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
如果您修复此引用,则一切都应该有效。
答案 1 :(得分:0)
不跟随(python manage.py collectstatic
)运行可能是您的问题。
您可以通过将static()
调用移出模型字段并将默认值更改为字符串"pledges/images/no-profile-photo.png"
来解决此问题并改进代码。它应该看起来像这样:
avatar_url = models.URLField(default='pledges/images/no-profile-photo.png')
访问avatar_url
时,请使用其中一个
(前端/ Django模板选项){% static profile_instance.avatar_url %}
,其中profile_instance
是引用Profile对象的上下文变量。
(后端/ Python选项)使用static(profile_instance.avatar_url)
。
通过使用static()
的结果作为默认值,该应用程序将一个包含STATIC_URL
前缀的URL放入数据库中-就像对它进行硬编码一样,因为数据不会settings.py
更改时间。一般来说,您完全不应该将static()
的结果存储在数据库中。
如果您确保每次访问{% static %}
都在前端显示时使用static()
标签或avatar_url
函数,则STATIC_URL
仍将是在运行时根据您的环境配置添加。
This SO thread has a lot of good content on staticfiles
似乎您具有循环依赖项:
collectstatic
需要运行才能创建manifest.json
您的应用程序需要加载才能运行manage.py
命令,该命令调用static()
static()
依靠manifest.json
中的条目来解决。
来源答案在这里。 Django Model: ValueError: Missing staticfiles manifest entry for "file_name.ext"