【问题标题】:ValueError at / Missing staticfiles manifest entry for ''ValueError at / Missing staticfiles manifest entry for ''
【发布时间】:2018-03-10 19:13:56
【问题描述】:

我正在尝试从 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。

【问题讨论】:

    标签: django


    【解决方案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

    如果你修复了这个引用,那么一切都会正常。

    【讨论】:

    • 就我而言,只是缺少favicon.ico 文件。让整个服务器仅在生产中关闭 500 是相当残酷的。
    • 我也这么认为@Overdrivr,这太过分了。这种错误不应该停止服务器。为什么丢失的文件不能被 404 处理?
    【解决方案2】:

    未运行关注 (python manage.py collectstatic) 可能是您的问题。

    解决办法:

    您可以通过将static() 调用移出模型字段并将默认值更改为字符串"pledges/images/no-profile-photo.png" 来规避此问题并改进代码。它应该是这样的:

    avatar_url = models.URLField(default='pledges/images/no-profile-photo.png')

    当您访问avatar_url 时,请使用任一

    1. (前端/Django 模板选项){% static profile_instance.avatar_url %},其中profile_instance 是一个引用 Profile 对象的上下文变量。

    2. (后端/Python 选项)使用static(profile_instance.avatar_url)。

    说明:

    通过使用static() 的结果作为默认值,应用程序将包含STATIC_URL 前缀的URL 放入数据库中——这就像硬编码一样,因为@987654333 时数据不会改变@ 做。更一般地说,您根本不应该将static() 的结果存储在数据库中。

    如果您确保每次访问avatar_url 以在前端显示时都使用{% static %} 标记或static() 函数,则仍将根据您在运行时的环境配置添加STATIC_URL .

    This SO thread has a lot of good content on staticfiles

    为什么会发生错误:

    看起来你有一个循环依赖:

    1. collectstatic 需要运行才能创建manifest.json

    2. 您的应用程序需要加载才能运行manage.py 命令,该命令调用static()

    3. static() 依赖于 manifest.json 中的条目来解析。

    来源答案在这里。 Django Model: ValueError: Missing staticfiles manifest entry for "file_name.ext"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-12
      • 2012-03-13
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      相关资源
      最近更新 更多