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解决了静态文件,可以扩展配置让它处理媒体文件:
- 在
settings.py中添加:
WHITENOISE_MEDIA_PREFIX = '/media/'
- 修改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,服务器无法匹配到对应文件。
解决办法:
- 修正上传逻辑:如果用Django原生的
ImageField,默认会自动用正斜杠存储路径;如果是自定义上传逻辑,检查代码确保保存到数据库的路径用正斜杠images/filename.png。 - 临时模板层修复:在模板中把反斜杠替换成正斜杠:
{% 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,提问作者виталик панасюк
相关产品推荐
相关产品推荐

