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静态图像不显示的主要内容,如果未能解决你的问题,请参考以下文章