Django FileField的upload_to参数在Ubuntu服务器报权限错误如何解决
问题原因
Django的FileField的upload_to参数值会自动拼接settings.MEDIA_ROOT配置的路径作为最终存储路径,你本地环境已经正确配置了MEDIA_ROOT = '/Users/whitebear/myproj/',所以拼接upload_to='_mat/'后得到的路径正确。
服务器上触发报错是因为你生产环境的MEDIA_ROOT没有配置/配置错误,为空时直接拼接_mat/就会得到根路径下的/_mat,系统没有根目录的写入权限,自然抛出权限错误。同时Django官方规定upload_to必须传入相对路径,所以你直接传绝对路径会触发校验报错。
解决方案
- 第一步:修改生产环境的Django配置文件
settings.py,添加/修改MEDIA_ROOT配置,指向你项目的根路径:
MEDIA_ROOT = '/var/www/html/myproj/' # 可选配置访问静态文件的URL前缀,后续需要用文件URL时要用到 MEDIA_URL = '/media/'
- 第二步:验证配置是否生效,可以进入项目的Django shell执行以下命令查看输出是否正确:
from django.conf import settings print(settings.MEDIA_ROOT)
- 第三步:(可选优化)撤销
_mat目录的777权限,将目录所有者改为运行Nginx Unit服务的用户(通常是unit或者www-data),权限设置为755即可,避免权限过大带来的安全风险:
chown -R unit:unit /var/www/html/myproj/_mat/ chmod -R 755 /var/www/html/myproj/_mat/
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

