You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django框架Python应用:FPDF生成PDF权限异常致邮件附件读取失败及ACL配置无效问题求助

解决Django+FPDF生成PDF后邮件附件找不到的权限问题

看起来你遇到的核心问题是FPDF生成的PDF文件没有继承media目录的权限,且ACL配置干扰了权限修改,导致Django无法读取文件作为邮件附件。我来一步步帮你解决:

1. 重置并正确配置media目录的ACL

你之前的ACL配置可能存在冲突,导致chmod命令无法生效。先清除所有旧的ACL规则,再设置正确的默认权限继承:

  • 移除media目录的所有ACL规则:
    sudo setfacl -bR /var/www/johannasenvironment/JohannasEnviroment/media
    
  • 设置默认ACL,让新生成的文件自动赋予www-data用户/组读写权限:
    sudo setfacl -d -m u:www-data:rwx /var/www/johannasenvironment/JohannasEnviroment/media
    sudo setfacl -d -m g:www-data:rwx /var/www/johannasenvironment/JohannasEnviroment/media
    
    这里的-d表示设置默认ACL,后续在该目录下创建的文件都会继承这个权限规则。

2. 调整Python进程的umask设置

FPDF生成文件时,会受到Python进程的umask影响。你可以在保存PDF的代码里临时修改umask,确保生成的文件有足够权限:

import os
from fpdf import FPDF

# 生成PDF的逻辑...
pdf = FPDF()
# ...添加内容...

# 保存前临时修改umask,让新文件权限为rw-rw-r--
old_umask = os.umask(0o002)
report_path = "media/PaySuppiler--27022022142925.pdf"  # 建议用绝对路径,看下一步
pdf.output(report_path)
# 恢复原来的umask
os.umask(old_umask)

0o002的umask会让新文件的权限为664(rw-rw-r--),这样www-data作为组用户就能读取文件。

3. 使用Django的绝对路径避免文件找不到

错误提示里的路径是相对路径media/PaySuppiler--27022022142925.pdf,这可能导致Django在不同上下文下找不到文件。建议用Django配置里的MEDIA_ROOT拼接绝对路径:

from django.conf import settings
import os

# 生成唯一文件名(比如带时间戳)
timestamp = "27022022142925"
report_filename = f"PaySuppiler--{timestamp}.pdf"
# 拼接绝对路径
report_path = os.path.join(settings.MEDIA_ROOT, report_filename)

# 然后用这个路径保存PDF和作为邮件附件
pdf.output(report_path)
# 邮件附件部分
email_traslado.attach_file(report_path)

这样能确保Django精准定位到文件,避免相对路径的坑。

4. 验证media目录的所属组(可选)

你的media目录当前所属组是administrador,可以把组改成www-data,进一步确保权限兼容:

sudo chown -R administrador:www-data /var/www/johannasenvironment/JohannasEnviroment/media

做完这些步骤后,重新生成PDF文件,用ls -l查看权限,应该会看到文件权限变为-rw-rw-r--,此时Django就能正常读取文件并添加到邮件附件了。

内容的提问来源于stack exchange,提问作者Sebastian Narvaez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:52:43