【问题标题】:Media images not showing, even though they successfully load on the page媒体图像未显示,即使它们已成功加载到页面上
【发布时间】:2017-07-31 04:09:43
【问题描述】:

与大多数 Django 应用程序一样,用户上传的图像存储在 media 文件夹中。但是由于某种原因,在我对我的应用程序进行了一些更改后,它们停止显示。奇怪的是,当我单击图像 div 上的检查元素时,它显示了 img src 并且它是正确的。当我将鼠标悬停在 img src:<img src="/media/REC-2.jpg"> 上时,它只会显示“无法加载图像”。请记住,我所有的静态文件都显示正常。只是媒体图片(通过用户Post 上传的图片)没有显示。

在我看来,还有一件奇怪的事情可以说明问题所在。这是我的代码:

choices.py

CATEGORY_CHOICES = (
    ('1', 'news'),
    ('2', 'sport'),
    ('3', 'technology'),
)

网址

url(r'^(?P<category>\w+)/', boxes_view, name='bv'),

观看次数

def boxes_view(request, category):
    print('initial', category)

    for a, b in CATEGORY_CHOICES:
        if b == category:
            category = a

    print('category', category)

    posts = Post.objects.filter(category=category)
    for post in posts:
        print('POST', post.id)

    return render(request, 'boxes.html', {'posts': posts})

这是加载页面后我的终端中出现的内容 (http://127.0.0.1:8000/news/):

initial news
category 1
POST 1
POST 2
...
POST 241
POST 242
[09/Mar/2017 23:39:33] "GET /news/ HTTP/1.1" 200 19661
[09/Mar/2017 23:39:34] "GET /static/css/base.css HTTP/1.1" 304 0
initial media
initial media
category media
initial media
category media
initial media
initial media
[09/Mar/2017 23:39:34] "GET /static/images/settingsIcon.png HTTP/1.1" 304 0
category media
[09/Mar/2017 23:39:34] "GET /media/465054_3137058941780_869886704_o_o8zCskP.jpg HTTP/1.1" 200 6370
[09/Mar/2017 23:39:34] "GET /static/images/trtLogo.png HTTP/1.1" 304 0
category media
category media
[09/Mar/2017 23:39:34] "GET /media/REC-2.jpg HTTP/1.1" 200 6370
[09/Mar/2017 23:39:34] "GET /static/images/mapIcon.png HTTP/1.1" 304 0
[09/Mar/2017 23:39:34] "GET /static/js/base.js HTTP/1.1" 304 0
[09/Mar/2017 23:39:34] "GET /media/htcStory_xoFbTkY.JPG HTTP/1.1" 200 6370
[09/Mar/2017 23:39:34] "GET /media/34_comparison.jpg HTTP/1.1" 200 6370
[09/Mar/2017 23:39:34] "GET /media/REC_aeXxNPK.jpg HTTP/1.1" 200 6370

这里发生了什么?前几行是正确的,它打印initial news,然后在通过for循环后打印category 1,然后它通过每个Post。然后一切都很奇怪。它回到第一个打印语句并多次打印initial mediacategory media。在这些打印之间,它会加载媒体图像。知道发生了什么以及如何解决吗?

编辑:完整的 urls.py

urlpatterns = [
    url(r'^more/$', more, name='more'),
    url(r'^q/', search, name='search'),
    url(r'^admin/', admin.site.urls, name='admin'),
    url(r'^post/', include('post.urls')),
    url(r'^accounts/', include('allauth.urls')),

    url(r'^profile/(?P<user>\w+)/', profile, name='profile'),

    #category
    url(r'^(?P<category>\w+)/(?P<id>\d+)/', article, name='article'),
    url(r'^(?P<category>\w+)/', boxes_view, name='bv'),
]

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

settings.py

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

STATIC_URL = '/static/'

STATIC_ROOT = 'draft1/static'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

【问题讨论】:

  • 我认为这不会解决您的媒体问题,但是您忘记在大多数网址的末尾添加$,这意味着您最终可能会遇到一些意想不到的行为。您从其他模块导入的 url 不需要它,但您很可能希望将其放在名为 profilearticlebv 的 url 上。
  • 它没有解决它,但是当我在bv的末尾添加$时,所有媒体图像请求都从"GET /news/media/htcStory_xoFbTkY.JPG HTTP/1.1" 200 19616变为"GET /news/media/htcStory_xoFbTkY.JPG HTTP/1.1" 404 4923。如果我不添加$,那么媒体的 GET 在 200 之后都具有相同的数字,而添加 $ 将为 404 之后的每个图像提供不同的数字。
  • 好的,所以我认为有两个问题 - 这个问题掩盖了媒体文件的真正问题,即它们没有在该地址提供服务。之前发生的事情是对/media/ 的请求被路由到boxes_view 并且没有返回任何内容。您现在可以更有效地调试媒体文件问题。
  • 实际上添加$ 确实解决了问题,我的错误。按照@Julien 的建议,我将设置中的MEDIA_URL = '/media/' 更改为MEDIA_URL = 'media/'。但我现在已经把它换回来了,$ 确实解决了它。十分感谢你的帮助。你能解释一下为什么排除$会导致问题吗?
  • 很高兴听到! $ 是“正则表达式结束”的正则表达式代码。如果您忽略添加 $,正则表达式解析器只会继续寻找匹配项。因此,在您的情况下,与前面列出的 url 模式之一不匹配的每个 url 都已成功匹配到您的 boxes_view,因为 '^(?P&lt;category&gt;\w+) 是一个非常广泛的表达式。因此对/media/whatever.jpg 的请求被路由到boxes_view。在这种情况下,如果我更仔细地阅读您的终端输出,我应该更早地了解它 - 来自boxes_view 的打印语句被称为“媒体”作为类别。

标签: python django


【解决方案1】:

问题看起来并不在这里,而是在您的图片上传代码中。由于每个 jpg 具有相同的大小 (6370) 并且每个 png 具有大小 0,因此您提供图像的方式有问题。

事实上,除了最初的GET /news/ 之外的所有请求似乎都失败了。对/static/ 的请求的响应大小均为0,对/media/ 的请求的响应大小均为6370

【讨论】:

  • 如何查看图片是否存在问题?此外,所有静态文件都可以正常工作并且显示良好,即使它显示为 0(不确定这意味着什么)。
  • 查看您的应用为jpg 文件提供的那6370 字节是什么。打开 Chrome 网络选项卡,单击对 jpg 资源的请求,然后预览响应。
  • 所有媒体图片都显示“此请求没有可用的响应数据”。他们也没有可用的预览。
  • 当您直接访问这些媒体 URL 时会发生什么?
  • 当我直接点击网址时,页面会加载我的模板boxes.html(为空,其中没有查询集)。 url栏显示:http://127.0.0.1:8000/media/htcStory_xoFbTkY.JPG
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2019-02-27
  • 2013-03-27
  • 2015-07-01
相关资源
最近更新 更多