Flask部署到Heroku出现FileNotFoundError找不到static目录如何解决?
报错原因及修复方案
根因分析
- 路径分隔符系统不兼容:你本地开发环境大概率是Windows系统,路径分隔符用反斜杠
\,而Heroku运行环境是Linux系统,路径分隔符为正斜杠/。代码中硬编码的'static\perssonel_data'在Linux系统中会被识别为单个文件名,而非static目录下的子目录,因此触发文件不存在报错。同时反斜杠在Python字符串中属于转义字符,即使在Windows环境下也可能因为转义逻辑导致路径识别异常。 - 相对路径依赖运行时工作目录:你使用的相对路径是相对于Python进程的运行工作目录生效的,若Heroku启动Flask进程时的工作目录不是项目根目录,即使路径分隔符正确也会找不到对应目录。
修复方案
不要硬编码路径,改用Python标准库的路径拼接工具,自动适配不同操作系统,同时基于固定基准生成绝对路径,避免相对路径的不确定性:
from PyPDF2 import PdfFileReader, PdfFileWriter import re import os def create_desprendible(id, name, month): # 以当前脚本所在目录为基准生成绝对路径,也可以用Flask的current_app.root_path更适配Flask项目 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 自动适配系统的路径分隔符拼接目录 path_test = os.path.join(BASE_DIR, 'static', 'perssonel_data') # 直接拼接目标文件路径,不需要遍历目录效率更高 target_pdf = os.path.join(path_test, f'perssonel_data_{month}.pdf') # 先判断文件是否存在,避免未定义报错 if not os.path.exists(target_pdf): raise FileNotFoundError(f"对应月份的工资单文件不存在:{target_pdf}") pdf = PdfFileReader(target_pdf) pages = [] for i in range(pdf.getNumPages()): content = pdf.getPage(i).extractText() + "\n" if re.search(id, content): pages.append(i) if not pages: raise ValueError(f"未找到ID为{id}的员工工资单") pdfWriter = PdfFileWriter() for page_num in pages: pdfWriter.addPage(pdf.getPage(page_num)) pdf_name = f'DESPRENDIBLE_DE_NOMINA_{str(name).replace(" ", "_")}.pdf' with open(pdf_name, 'wb') as f: pdfWriter.write(f) return pdf_name
额外注意事项
Heroku的文件系统是临时文件系统,你代码中生成的pdf_name文件会在应用重启、部署或者24小时无活动后被自动清除,若需要长期保存生成的工资单,建议对接对象存储服务。
内容的提问来源于stack exchange,提问作者Carlos S. C.
相关产品推荐
相关产品推荐

