django ValueError at / Missing staticfiles manifest entry for ''

shstlldc  于 2023-07-01  发布在  Go
关注(0)|答案(3)|浏览(131)

我正在尝试从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模板标记看这个答案。

epggiuax

epggiuax1#

问题是在模板的某个地方引用了一个不存在的静态文件。具体来说,就是向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
如果你修复了这个引用,那么一切都应该正常。

bxgwgixi

bxgwgixi2#

不运行以下(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对象的上下文变量。
1.(后端/ Python选项)使用static(profile_instance.avatar_url)

说明:

通过使用static()的结果作为默认值,该应用程序将一个包含STATIC_URL前缀的URL放入数据库中-这就像硬编码一样,因为当settings.py发生变化时,数据不会发生变化。更一般地说,根本不应该将static()的结果存储在数据库中。
如果您确保每次访问avatar_url以在前端显示时都使用{% static %}标记或static()函数,则STATIC_URL仍将在运行时根据您的环境配置添加。
This SO thread has a lot of good content on staticfiles

错误原因:

看起来你有一个循环依赖:
1.需要运行collectstatic才能创建manifest.json
1.您的应用程序需要加载以运行manage.py命令,该命令调用static()

  1. static()依赖manifest.json中的条目来解析。
    答案来源在这里。Django Model: ValueError: Missing staticfiles manifest entry for "file_name.ext"
jv2fixgn

jv2fixgn3#

在我的例子中,我在docker中运行django,但不是作为root用户。从外面看,我运行的是python manage.py collectstatic。这会以root用户的身份运行manage.py,使得django本身无法访问这些文件。
解决方案:以在docker中运行django的同一用户身份运行该命令,或者在static目录中使用chown命令。

相关问题