django 模板渲染的媒体图像损坏

media image rendered by django template broken

settings.py

INSTALLED_APPS = [...#'django.contrib.staticfiles',]

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

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

my_app/urls.py

urlpatterns = [
url(r'^welcome/', views.upload, name='upload'),] + 
static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

my_app/templates/template.html

<img src='media/my_image.jpeg'>

my_app/views.py

def upload(request):
    if request.METHOD == 'POST:
    ...
        return redirect(to another page)
    return render(request, 'template.html')

template.html 渲染正确,但图像损坏。

当我尝试时

curl -D - http://127.0.0.1:8000/my_app/welcome/media/my_image.jpeg

我得到了 200,当我在浏览器中欢迎 URL 后端 returns

[22/Mar/2018 13:31:57] "GET /my_app/welcome/ HTTP/1.1" 200 411
[22/Mar/2018 13:31:57] "GET /my_app/welcome/media/my_image.jpeg HTTP/1.1" 200 411

所以我认为这不是 url 问题。 Chrome 正在显示图像。有什么想法吗?

首先,您的正则表达式缺少 $,因此它不仅匹配 /welcome/,而且匹配 /welcome/media/my_image.jpeg(这就是为什么您的 curl 命令 returns状态代码 200)。将 URL 模式更改为:

url(r'^welcome/$', views.upload, name='upload'), 

接下来,您缺少前导斜杠以使其成为绝对 URL。

<img src='/media/my_image.jpeg'>

最后,您需要为媒体文件和静态文件提供服务器。 In development,您可以将以下内容添加到您的 项目的 urls.py:

urlpatterns = [
    ...
]

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