生产环境下Django表单上传媒体文件出现500错误的排查方案
生产环境表单上传图片触发500错误排查方案
问题概况
生产环境中仅上传图片的表单提交时返回500错误,其他模型表单可正常写入数据库;开发环境无此问题,推测与Nginx的媒体URL配置相关。使用Gunicorn+Nginx+Supervisor部署应用,VPS存在严重缓存问题,修改代码后页面内容无变化。
环境配置
- 应用路径:
/home/boards/myapp - Django settings.py配置:
MEDIA_ROOT = BASE_DIR / 'media' MEDIA_URL = "/media/"
- urls.py配置(存在语法错误):
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- Nginx配置(疑似路径错误):
location /media/ { alias /home/boards/media/; }
- 模型代码:
class Photos(models.Model): def user_directory_path(instance, filename): # file will be uploaded to MEDIA_ROOT/user_<id>/<filename> return 'user_{0}/{1}'.format(instance.user, filename) images = ResizedImageField(size=[500, 300], upload_to=user_directory_path, blank=True, null=True)
- 视图代码片段:
if form_photos.is_valid(): print("Form photos is valid") username = request.user images = request.FILES.getlist('images') print("Las imagenes son", images) for image in images: Photos.objects.create(images=image, builtproperties_id=last_built_id, user=username) #messages.success(request, "Data saved") return redirect('listbuiltaddressphotos') else: # SI HAY FALLOS EN FOTOS print(form_photos.errors) return redirect('create_apartment_form')
已做排查
- 重载Nginx无效
- 开启Debug、添加日志配置、安装Sentry均未捕获错误详情
- Nginx访问日志仅显示500状态码,无其他错误信息;Firefox控制台确认所有字段(含图片)已提交
- 手动创建用户目录并设置
chmod 775权限,问题依旧
解决方案建议
1. 修正Nginx媒体路径
当前Nginx的alias路径指向/home/boards/media/,但实际MEDIA_ROOT应为/home/boards/myapp/media/(BASE_DIR是应用根目录),修改Nginx配置:
location /media/ { alias /home/boards/myapp/media/; expires 30d; add_header Cache-Control "public, max-age=2592000"; access_log off; }
修改后执行sudo nginx -t验证配置,再重载Nginx:sudo systemctl reload nginx
2. 修复urls.py语法错误
代码中多余的]+会导致Django运行异常,修正为:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 你的其他URL配置项 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
3. 解决目录权限问题
仅设置775权限不够,需确保Gunicorn运行用户(通常为www-data或部署用户)拥有媒体目录的读写权限:
sudo chown -R www-data:www-data /home/boards/myapp/media/ sudo chmod -R 755 /home/boards/myapp/media/
4. 清除缓存并重启服务
VPS缓存导致代码修改不生效,执行以下操作:
- 重启Supervisor管理的Gunicorn进程:
sudo supervisorctl restart your_app_name - 浏览器强制刷新页面(Ctrl+Shift+R)
- 若有Redis/Varnish等缓存服务,同步重启或清除缓存
5. 手动捕获错误日志
在视图中添加try-except块强制记录错误:
import logging logger = logging.getLogger(__name__) if form_photos.is_valid(): print("Form photos is valid") username = request.user images = request.FILES.getlist('images') print("Las imagenes son", images) try: for image in images: Photos.objects.create(images=image, builtproperties_id=last_built_id, user=username) return redirect('listbuiltaddressphotos') except Exception as e: logger.error(f"保存图片失败: {str(e)}", exc_info=True) return HttpResponse(f"错误详情: {str(e)}", status=500) else: print(form_photos.errors) return redirect('create_apartment_form')
之后查看Django或Gunicorn日志文件,获取具体错误信息。
6. 检查图片处理依赖
确认生产环境已安装ResizedImageField所需的Pillow库:
pip install pillow
内容的提问来源于stack exchange,提问作者Alvar
相关产品推荐
相关产品推荐

