我有一个模块,通过使用Jinja2呈现模板来处理创建和执行SQL查询。模块本身和名为' templates'的目录。位于我可以从网络上的多台计算机访问的网络驱动器上。
当我在同一目录中工作时,一切都正常,正如预期的那样。
当我尝试从单独的位置加载和使用此模块时,出现TemplateNotFound:
错误。函数本身看起来像这样,包含突出显示错误的行:
from jinja2 import Environment, FileSystemLoader, Template, meta
def get_sql_query(position):
filename = "PositionDelta.sqltemplate"
# Create Jinja2 Environment, using the 'templates' folder
env = Environment(loader=FileSystemLoader('templates')) # Error!
template = env.get_template(filename)
# Get source of template file
template_source = env.loader.get_source(env, filename)[0]
# Parse template source and get all undeclared variables
parsed_content = env.parse(template_source)
template_variables = list(meta.find_undeclared_variables(parsed_content))
# Get all tag values associated with position
tag_values = get_tags_list(position)
# Combine template variables and tag values into dictionary and render sql query from template
dictionary = dict(zip(template_variables, tag_values))
sql_query = template.render(dictionary)
return sql_query
失败的功能如下:
env = Environment(loader=FileSystemLoader('templates'))
我认为当我调用FileSystemLoader
函数时,它会搜索相对于工作文件夹的模板文件夹。如何设置它以查找相对于模块位置本身的模板目录?
答案 0 :(得分:3)
这对我有用:
from jinja2 import Environment, FileSystemLoader
template_dir = '/home/colin/template_dir'
env = Environment(loader=FileSystemLoader(template_dir))
我的猜测是,因为你的路径不是以正斜杠开始相对于你的应用程序的加载。尝试使用模板目录的完整路径。
答案 1 :(得分:2)
最后,我正在寻找的方法需要我将模块创建到一个包中。我决定使用Jinja2的包加载器方法,因为它查找相对于包本身的模板文件,而不是相对于工作目录:
import jinja2
templateEnv = jinja2.Environment( loader=jinja2.PackageLoader('package_name', 'templates'))
template = templateEnv.get_template( 'template_filename' )
template.render({'var1':var1, 'var2':var2})