Django提交表单时报错[Errno 30]只读文件系统'/media'如何解决?
Django Media目录上传报错问题解决
问题原因
- MEDIA_ROOT配置与实际项目结构不匹配:当前配置的存储路径为
BASE_DIR/staticfiles/media_root,但实际media目录位于项目根目录与manage.py同级,Django尝试写入不存在的路径时会触发权限报错。 - 模型文件字段配置错误:如果Mots模型的FileField/ImageField的
upload_to参数以斜杠开头,会被识别为系统绝对路径,直接指向系统根目录的/media路径,该路径默认对普通进程只读,就会触发你看到的报错。 - 开发环境未配置media路由或生产环境反向代理配置错误,也可能导致路径解析异常。
解决方案
1. 修正settings.py配置
将MEDIA_ROOT修改为对应实际media目录的路径:
# settings.py 替换原有MEDIA_ROOT配置 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
2. 检查模型字段配置
打开models.py,确认Mots模型的image字段upload_to参数没有以斜杠开头:
# 错误写法(会指向系统根目录/media) image = models.FileField(upload_to="/media/") # 正确写法(路径相对于MEDIA_ROOT,最终存储到项目根目录/media/imgs下) image = models.FileField(upload_to="imgs/") # 若无需子目录,可直接写 upload_to=""
3. 开发环境补充路由配置
如果是本地runserver启动的开发环境,在主urls.py中添加media路径映射:
from django.conf import settings from django.conf.urls.static import static # 原有urlpatterns定义 urlpatterns = [ # 你的其他路由 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
4. 生产环境权限配置
如果是线上部署环境,不要使用777权限,将media目录的所属权改为运行Django进程的用户即可:
# 示例:假设运行Django的用户为www-data,项目根目录为/opt/my_project sudo chown -R www-data:www-data /opt/my_project/media sudo chmod -R 755 /opt/my_project/media
内容的提问来源于stack exchange,提问作者Cyril
相关产品推荐
相关产品推荐

