使用Jinja2与pdfkit在Streamlit生成PDF遇TemplateNotFound错误求助
解决Jinja2 TemplateNotFound错误
错误原因
你的代码使用相对路径./作为Jinja2的模板搜索路径,但Streamlit运行时的当前工作目录可能并非app.py所在的根目录(比如从其他目录启动应用、多页面结构导致路径上下文变化),导致Jinja2无法定位到reportTemplate.html文件。
解决方案
通过Python的os模块结合__file__获取app.py的绝对目录,以此作为模板搜索路径,确保无论运行环境如何都能准确找到模板文件。
修改后的Python代码
import streamlit as st import pandas as pd import numpy as np import altair as alt import pdfkit import jinja2 import os # 新增os模块用于路径处理 uploaded_file = st.file_uploader("", accept_multiple_files=False) if uploaded_file: # 新增判断,避免未上传文件时触发报错 df = pd.read_csv(uploaded_file) TEMPLATE_FILE = "reportTemplate.html" # 获取当前app.py所在的绝对目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 以绝对目录作为模板搜索路径 templateLoader = jinja2.FileSystemLoader(searchpath=current_dir) templateEnv = jinja2.Environment(loader=templateLoader) template = templateEnv.get_template(TEMPLATE_FILE) outputText = template.render(df=df, month='May') # 用绝对路径保存生成的HTML文件,避免路径歧义 html_output_path = os.path.join(current_dir, 'report.html') with open(html_output_path, 'w') as html_file: html_file.write(outputText)
额外检查项
- 确认
reportTemplate.html的文件名拼写完全正确(Linux/macOS系统对文件名大小写敏感)。 - 如果后续将模板文件移至子目录,需调整
searchpath为对应子目录的绝对路径(例如os.path.join(current_dir, 'templates'))。
内容的提问来源于stack exchange,提问作者farhat
相关产品推荐
相关产品推荐

