You need to enable JavaScript to run this app. Ubuntu18.04 Apache2 Django下matplotlib.savefig报PermissionError:[Errno13]如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:51:00