Ubuntu18.04 Apache2 Django下matplotlib.savefig报PermissionError:[Errno13]如何解决
问题根因
Errno 13属于操作系统权限拒绝错误,你修改view.py文件权限的操作完全没有作用:该错误是运行Django服务的进程没有权限写入你指定的静态文件目录,和代码文件本身的权限无关。
本地Mac环境运行测试服务时,进程默认使用你当前登录的个人用户启动,该用户本身就持有项目目录的读写权限,所以不会报错;而Ubuntu上Apache部署的Django服务默认使用www-data用户运行进程,默认没有项目目录的写入权限,因此存图时触发报错。
解决方案步骤
- 第一步:优先修正代码里的硬编码相对路径,避免相对路径匹配错误,导致程序写到无权限的系统目录。修改代码如下:
from django.conf import settings import os def saveChart(request): ... plt.plot(val1, var2) # 动态拼接静态文件存储路径,避免相对路径错误 save_path = os.path.join(settings.BASE_DIR, 'static', 'chart.png') plt.savefig(save_path) plt.close()
- 第二步:给目标存储目录赋予
www-data用户对应权限,将命令中的路径替换为你实际的项目静态目录路径:
# 递归修改static目录属主为Apache运行用户www-data sudo chown -R www-data:www-data /你的Django项目实际路径/static # 给static目录设置合理的读写权限,不要使用777权限 sudo chmod -R 755 /你的Django项目实际路径/static
- 第三步:如果操作完仍报错,给项目根目录添加其他用户的执行权限,保证
www-data可以进入目录层级:
sudo chmod o+x /你的Django项目实际路径
额外注意事项
- 生产环境不要随意设置777权限,有严重的安全风险,权限配置需要最小化适配
- 如果报错信息指向matplotlib缓存目录无权限,可以在代码开头指定matplotlib缓存目录到系统公共临时目录:
import os os.environ['MPLCONFIGDIR'] = '/tmp/matplotlib'
内容的提问来源于stack exchange,提问作者Jin San KIM
相关产品推荐
相关产品推荐

