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

生产环境下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:04:54