Django Admin FileField生产环境下载404问题求助
核心原因
生产环境下DEBUG=False时,django.conf.urls.static.static()不会向路由中添加/media和/static的映射规则——这个方法仅用于开发环境。文件虽然上传到了正确目录,但Web服务器(比如Nginx/Apache)没有配置对应的路径映射,导致请求/media路径时找不到资源,返回404。
分步解决方案
确认生产环境DEBUG状态
检查settings.py中DEBUG = False,生产环境绝对不能开启DEBUG,否则会暴露敏感信息且性能低下。配置Web服务器映射/media路径
以Nginx为例,在站点配置文件中添加以下location块,替换/path/to/your/media/dir为你实际的MEDIA_ROOT绝对路径:location /media/ { alias /path/to/your/media/dir/; expires 30d; }配置完成后重启Nginx:
sudo systemctl restart nginx检查文件与目录权限
确保Web服务器进程(通常是www-data)对MEDIA_DIR目录及其中的文件有读取权限:# 设置目录权限 sudo chmod -R 755 /path/to/your/media/dir # 设置所有者为Web服务器用户 sudo chown -R www-data:www-data /path/to/your/media/dir验证MEDIA_ROOT的绝对路径
在Django shell中打印实际路径,确认路径正确:python manage.py shell >>> from django.conf import settings >>> print(settings.MEDIA_ROOT)确保输出的路径和文件实际存储的目录完全一致,没有拼写错误或相对路径问题。
移除生产环境urls.py中的static()调用
既然生产环境用Web服务器处理静态文件,urls.py里的+ static(...)可以删掉,避免混淆:urlpatterns = [ path('jet/', include('jet.urls', 'jet')), path('admin/', admin.site.urls), ]
你的配置分析
当前urls.py中通过static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)添加的路由,在DEBUG=False时会被Django忽略,这就是下载404的直接原因。MEDIA_URL和MEDIA_ROOT的配置本身是正确的,问题出在生产环境的服务方式上。
内容的提问来源于stack exchange,提问作者Simon Fritz

