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

Django无法上传文件至NFS挂载目录问题排查求助

Django DRF上传图片至NFS目录但文件未实际写入的问题排查与解决

问题背景

使用Django Rest Framework开发图片上传功能,配置MEDIA_ROOT指向NFS挂载目录/testmnt/alltestdata/allimages/test/runner,前端(React)和Postman均能正常上传并通过API获取图片,但实际在NFS挂载目录中找不到上传的文件。

环境信息:

  • 后端:Django + DRF
  • 前端:React.js
  • NFS挂载:以rw权限挂载,挂载信息:xxx.xxx.x.x:/mnt/DataPool on /testmnt/alltestdatatype nfs (rw,relatime,sync,vers=3,...)
  • 访问方式:PuTTY连接端口8000

目录权限详情:

drwxrwxrwx 27 root root 29 Sep 11 07:25 /testmnt/alltestdata 
drwxr-xr-x 4 testadmin testadmin 4 Sep 19 05:59 /testmnt/alltestdata/allimages/test 
drwxrwx-r-x 2 root root 4 Sep 24 01:50 /testmnt/alltestdata/allimages/test/runner

可能原因与排查步骤

1. Django运行用户无NFS目录写入权限

从目录权限来看,runner目录的所有者是root:root,权限为drwxrwx-r-x——仅所有者和所属组有写入权限,其他用户只有读/执行权限。如果Django进程的运行用户(比如www-data、testadmin或本地启动进程的用户)不在root组且不是root用户,就无法写入该目录,此时Django会静默将文件写入临时存储或内存,导致API能返回但NFS目录无文件。

排查方法:

  • 查看Django进程的运行用户:
    ps aux | grep django  # 或 grep gunicorn(若用Gunicorn部署)
    
  • 测试该用户对目标目录的写入权限:
    su - <django运行用户> -c "touch /testmnt/alltestdata/allimages/test/runner/test_write.txt"
    
    如果命令报错(如Permission denied),则确认为权限问题。

解决方法:

  • 调整目录所有者为Django运行用户:
    chown <django运行用户>:<django运行用户> /testmnt/alltestdata/allimages/test/runner
    
  • 或临时开放其他用户的写入权限(仅测试用,生产环境不推荐):
    chmod o+w /testmnt/alltestdata/allimages/test/runner
    

2. MEDIA_ROOT配置未生效或路径错误

可能存在settings.py中MEDIA_ROOT拼写错误,或配置未被正确加载,导致Django将文件写入了默认路径而非NFS目录。

排查方法:

  • 进入Django Shell验证配置:
    python manage.py shell
    
    执行以下代码查看实际生效的MEDIA_ROOT:
    from django.conf import settings
    print(settings.MEDIA_ROOT)
    
    确认输出是否为/testmnt/alltestdata/allimages/test/runner。

解决方法:

  • 修正settings.py中的MEDIA_ROOT路径,确保无拼写错误、路径分隔符正确。

3. NFS挂载存在异常(本地目录覆盖或挂载失效)

如果NFS挂载前,/testmnt/alltestdata目录已有本地文件,挂载后本地文件会被隐藏,但Django可能仍在写入挂载前的本地目录(而非NFS共享目录)。

排查方法:

  • 验证NFS挂载的实际生效情况:
    df -h | grep /testmnt/alltestdata
    
    确认输出对应NFS服务器的路径。
  • 在目标目录手动创建文件,然后登录NFS服务器查看该文件是否存在:
    # 本地创建文件
    touch /testmnt/alltestdata/allimages/test/runner/manual_test.txt
    # 登录NFS服务器,查看/mnt/DataPool/allimages/test/runner目录下是否有该文件
    
    如果本地能看到但NFS服务器端看不到,说明挂载存在问题。

解决方法:

  • 重新挂载NFS目录:
    umount /testmnt/alltestdata
    mount -t nfs xxx.xxx.x.x:/mnt/DataPool /testmnt/alltestdata -o rw,relatime,sync,vers=3
    
  • 检查NFS服务器端的目录权限,确保服务器端/mnt/DataPool/allimages/test/runner有读写权限。

4. Django存储后端配置异常

如果自定义了DEFAULT_FILE_STORAGE(比如使用内存存储或其他云存储),文件不会写入本地NFS目录。

排查方法:

  • 检查settings.py中的DEFAULT_FILE_STORAGE配置,默认应为django.core.files.storage.FileSystemStorage。
  • 在上传视图中打印文件实际存储路径:
    # 示例上传视图
    class ImageUploadView(APIView):
        def post(self, request):
            serializer = ImageSerializer(data=request.data)
            if serializer.is_valid():
                instance = serializer.save()
                print("文件实际存储路径:", instance.image.path)  # 打印路径
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    确认打印的路径是否指向NFS目录。

解决方法:

  • 若无需自定义存储,删除DEFAULT_FILE_STORAGE配置,使用默认的FileSystemStorage。

内容的提问来源于stack exchange,提问作者Adam Haojan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:52:09