Django/Python Media资源可上传但AWS环境下无法渲染访问问题
问题原因
- Django 生产环境默认不提供媒体文件服务:你本地运行时
DEBUG = True,urls.py中通过static()方法添加的媒体资源路由会生效;但部署到生产环境后通常会关闭DEBUG模式,此时static()方法添加的路由会自动失效,直接访问媒体资源就会返回404。 - 反向代理未配置媒体路径映射:AWS部署环境一般会用Nginx/Apache作为反向代理处理静态资源请求,如果没有在反向代理配置中添加
/media/路径指向项目的MEDIA_ROOT目录,请求会直接被反向代理拦截,不会转发到Django服务,也会返回404。 - 目录权限不足:如果
media目录的权限配置错误,反向代理服务的运行用户没有目录读取权限,也会导致资源无法访问。
解决方法
方案1:配置反向代理处理媒体资源(生产环境推荐)
以最常用的Nginx为例,编辑你的站点配置文件(默认路径为/etc/nginx/sites-available/[你的项目名]),在server块中添加以下配置:
location /media/ { alias [替换为你项目MEDIA_ROOT的绝对路径,比如/opt/django_project/media/]; expires 30d; add_header Cache-Control "public, no-transform"; } location /static/ { alias [替换为你项目STATIC_ROOT的绝对路径,比如/opt/django_project/static/]; expires 30d; }
配置修改完成后,执行sudo nginx -t检查配置语法是否正确,确认无误后执行sudo systemctl restart nginx重启Nginx生效。
之后给media目录配置正确的权限,允许Nginx读取:
sudo chown -R :www-data [你的MEDIA_ROOT路径] sudo chmod -R 775 [你的MEDIA_ROOT路径]
方案2:强制Django处理媒体资源(仅用于临时测试,不推荐生产使用)
如果需要临时验证功能,可以修改项目的urls.py,强制添加媒体资源路由,不受DEBUG模式影响:
from django.urls import re_path from django.views.static import serve urlpatterns = [ # 保留你原来的所有路由配置 re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}), re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}), ]
内容的提问来源于stack exchange,提问作者Benjamin William Walker
相关产品推荐
相关产品推荐

