Django+Ubuntu+Apache环境写入文件出现PermissionError如何解决
Exception Type: PermissionError
Exception Value:
[Errno 13] Permission denied: 'x.mp3'
问题原因与解决方案
该错误本质是运行Django进程的系统用户,对文件写入的目标目录没有创建、修改文件的权限,按以下步骤排查即可解决:
修正文件保存路径写法
不要直接使用相对路径'x.mp3',Django运行时的工作目录可能和你预期的不一致,建议先在项目settings.py中统一配置媒体文件存储根目录:# settings.py 新增配置 import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 媒体文件统一存储在项目根目录的media文件夹下 MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'保存文件时拼接绝对路径,避免路径写错:
import os from django.conf import settings # 拼接得到文件的绝对存储路径 save_path = os.path.join(settings.MEDIA_ROOT, 'x.mp3') # 后续将文件内容写入save_path即可Linux/macOS 环境赋权
先确认运行Django服务的系统用户:本地开发一般是你当前登录的系统用户,用uWSGI/Gunicorn/Nginx部署的话通常是www-data用户。
执行以下命令给目标存储目录赋权:# 首先创建media目录如果不存在 mkdir -p 替换为你的项目完整路径/media # 给运行Django的用户分配目录所有权,本地开发将www-data替换为你自己的系统用户名 sudo chown -R www-data:www-data 替换为你的项目完整路径/media # 给目录添加读写执行权限 sudo chmod -R 755 替换为你的项目完整路径/mediaWindows 环境赋权
右键点击要写入的目标文件夹,依次选择「属性」→「安全」,找到运行Django的用户(本地开发就是当前登录的Windows用户,IIS部署的话对应应用池用户),给该用户添加「修改」「读取和执行」「列出文件夹内容」「读取」「写入」的权限,保存后重启Django服务即可。
内容的提问来源于stack exchange,提问作者jaya kumari
相关产品推荐
相关产品推荐

