Django静态图像不显示

Posted

技术标签:

【中文标题】Django静态图像不显示【英文标题】:Django static image not displaying 【发布时间】:2017-03-05 00:23:48 【问题描述】:

我已经尽可能地查看了所有内容,但我没有找到我遇到的问题的答案。我在这上面花了几个小时,发现没有用。

我的前端在项目下或应用树下使用静态文件夹显示所有图像和 css。

在我进行更改以使用动态 url,并从项目文件夹(向下一个文件夹)中创建静态文件夹后,collectstatic 突然间我的图像消失了,css 仍然可以直接路径或动态工作。

我尝试过对图像进行相同操作,直接路径(因为文件夹的副本仍保留在项目文件夹中)直接路径不起作用,动态路径也不起作用。

它也没有返回 404,在第一次加载时,它返回 200,在第二次 304 上,就好像图像在屏幕上一样,但它不是。没有错误,但不存在该死的图像。 令我困惑的是css可以工作,但图像不显示。

下面是我的代码。

---|settings.py

STATIC_URL = '/static/'

STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),
  #'/var/www/static/',
]

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")

---|url.py

if settings.DEBUG == True:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

---|main.html(模板)

% load staticfiles %
 <img src=% static "images/banner_top.png" %>

<img src="..static/images/banner_top.png">

<img src="static/images/banner_top.png">

在浏览器上图像不显示,但后端显示 200 和正确的图像路径。

http://127.0.0.1:8000/static/images/banner_top.png

[22/Oct/2016 22:32:10] "GET /static/images/banner_top.png HTTP/1.1" 200 0

这是标题

一般

Request URL:http://127.0.0.1:8000/static/images/banner_top.png
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8000

请求

 Content-Length:0
 Content-Type:image/png
 Date:Sun, 23 Oct 2016 08:06:17 GMT
 Last-Modified:Fri, 21 Oct 2016 06:54:06 GMT
 Server:WSGIServer/0.1 Python/2.7.10

【问题讨论】:

【参考方案1】:

嗯,问题已经解决了。 #django IRC 上的 Koterpillar 帮助我解决这个问题。

系统不知何故清空了图像文件(已损坏)(我认为这发生在 collectstatic 上),这就是图像被加载但没有显示的原因。

检查后

curl -D - http://127.0.0.1:8000/static/images/banner_top.png

只返回标题,没有内容。因此,请继续检查图像文件并验证内容是否消失。我用新图片替换,然后在网站重新加载时再次显示。

非常感谢 Koterpillar

【讨论】:

【参考方案2】:

首先我不明白你为什么设置如下。

urls.py

if settings.DEBUG == True:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

settings.py

STATIC_URL = '/static/'

STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),
  #'/var/www/static/',
]

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")

因为你在 urls.py 中写了static(settings.STATIC_URL, document_root=settings.STATIC_ROOT),同时你正在使用django.contrib.staticfiles 应用程序。如果将django.contrib.staticfiles 放入INSTALLED_APPS,它会自动切断静态文件。当你想手动切断静态文件时,你可以在 urls.py 中使用static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

请查看serving static files during development

一个选项

1.你不使用 django.contrib.staticfiles。

INSTALLED_APPS = [
(...)
#    'django.contrib.staticfiles',
]
    然后手动提供静态文件。

在 urls.py 中

+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

在 settings.py 中

STATIC_URL = '/static_cdn/'
STATIC_ROOT = os.path.join(BASE_DIR, "static_cdn")

如果你在项目文件夹下收集静态

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")

第二个选项

1.你使用 django.contrib.staticfiles。

INSTALLED_APPS = [
(...)
'django.contrib.staticfiles',
]

STATIC_URL = '/static_cdn/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static_cdn"),
and other path
]

首先,它会在app文件夹树下找到静态文件(现在我设置STATIC_URL = '/static_cdn/',所以在名称为static_cdn的文件夹中)。如果要获取不在应用文件夹树中的静态文件,请设置STATICFILES_DIRS =

我不知道为什么它返回 200 并且没有在您的浏览器上准确显示任何图像。但我假设您将两者混合在一起,不知何故导致了一些问题。请检查一下。

希望我的想法对你有帮助!祝你好运!

【讨论】:

我使用 if settings.DEBUG 只是为了检查设置是否处于调试状态,它不会影响系统的功能。我尝试过的所有方法都不起作用,我的问题在于为什么它返回 200,但图像只是丢失了。它可以找到目录和文件,所以配置是正确的。 我明白了。首先我提到,因为你不需要将 django.contrib.staticfiles 放在 INSTALLED APP 中,或者如果你在真正的服务器中而不是在开发过程中操作你的代码,你不需要以 urls 模式手动提供静态文件,对吧?因为您要为 Apache 服务器设置静态根目录。您将在指定文件夹中为 apache 收集静态文件。 (这是我的想法)所以我解释了,因为在我看来,您似乎在开发过程中混合了服务静态文件(您发布了 localhost 主机)。 我会考虑更多可能导致您出现这种情况的原因。 200 状态但没有图像显示 我在 urls.py 上注释掉了。不影响系统运行。此外,即使我编码使用本地静态/图像也不起作用。无论如何,无论我采用这种方式,使用外部(远程)静态或内部静态文件夹,只有我的 css 正确加载。使用 collectstatic,它可以正常运行并且也可以正确移动文件。我创建了一个新项目,只需检查一下即可。通过最小的更改,只是为了使应用程序返回带有图像的模板,图像不会显示。 django 1.10.2 有什么错误吗? 好吧,我试图犯同样的错误。但我无法得到它。所以显示的图像就像您在屏幕上没有状态 200 一样?我想知道是否只有特定图像会这样发生,或者静态文件夹中的所有图像都有相同的问题。好吧,我真的很想找出你的问题发生的原因,我调整了我的示例代码并进行了测试。但到目前为止,我无法找到我的知识。【参考方案3】:

我遇到了同样的问题。我使用的是 Django 1.11 所以经过几次调整后我找到的解决方案:-

这可行:不使用 % load staticfiles %

% static '/images/banner_top.jpg' %

【讨论】:

以上是关于Django静态图像不显示的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 模型中显示静态图像

Django静态模板标签不显示SVG

调试模式打开时的 Django 和静态文件

不允许在/空静态前缀处配置不当 - Django

Django staticfiles图像未显示

Django显示静态文件夹之外的图像/视频