You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Daphne运行Django应用时无法加载媒体图片求助

问题排查与解决方案

核心问题1:static()仅在开发环境生效

你用static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)配置的媒体文件路由,只有在DEBUG=True时才会生效,生产环境(包括用Daphne作为ASGI服务器的场景)Django不会处理这些静态/媒体请求,这是导致404的主要原因。

解决办法:

选项1:用Nginx反向代理处理媒体请求

这是生产环境的标准做法,配置Nginx拦截/media/开头的请求,直接指向你的MEDIA_ROOT目录:

location /media/ {
    alias /path/to/your/project/media/;
}

之后让Nginx反向代理到Daphne的8000端口即可。

选项2:用Whitenoise处理媒体文件(适合轻量场景)

既然你已经用Whitenoise解决了静态文件,可以扩展配置让它处理媒体文件:

  1. 在settings.py中添加:
WHITENOISE_MEDIA_PREFIX = '/media/'
  1. 修改ASGI应用文件(website/asgi.py),将Whitenoise中间件接入ASGI栈:
import os
from django.core.asgi import get_asgi_application
from whitenoise import WhiteNoise

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'website.settings')

application = get_asgi_application()
# 指向MEDIA_ROOT目录
media_root = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'media')
application = WhiteNoise(application, root=media_root)
application.add_files(media_root, prefix='media/')

核心问题2:数据库中的路径是反斜杠

你数据库里product.img的值是images\filename.png,Windows的反斜杠在URL中会被编码成%5C,导致实际请求路径变成/media/images%5Cfilename.png,服务器无法匹配到对应文件。

解决办法:

  1. 修正上传逻辑:如果用Django原生的ImageField,默认会自动用正斜杠存储路径;如果是自定义上传逻辑,检查代码确保保存到数据库的路径用正斜杠images/filename.png。
  2. 临时模板层修复:在模板中把反斜杠替换成正斜杠:
{% if product.img %}
  <img src="{{ MEDIA_URL }}{{ product.img|replace:"\\,/" }}" alt="{{ product.name }}" class="product-img">
{% endif %}

额外验证步骤

  • 确认MEDIA_ROOT目录下确实存在images/lcg.jpg文件,注意Linux/类Unix系统路径大小写敏感,需严格匹配。
  • 直接访问https://你的域名/media/images/lcg.jpg,验证是否能正常打开,排除SSL或网络层面的问题。

内容的提问来源于stack exchange,提问作者виталик панасюк

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:14