Jinja2 从与工作目录不同的位置加载模板

问题描述 投票:0回答:2

我有一个模块,通过使用 Jinja2 渲染模板来处理创建和执行 SQL 查询。模块本身和一个名为“模板”的目录位于网络驱动器上,我可以从网络上的多台计算机访问该驱动器。

当我在同一目录中工作时,一切正常,正如预期的那样。

当我尝试从单独的位置加载和使用此模块时,出现

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
函数时,它正在搜索相对于工作文件夹的模板文件夹。如何将其设置为查找相对于模块位置本身的模板目录?

python jinja2
2个回答
12
投票

这对我有用:

from jinja2 import Environment, FileSystemLoader
template_dir = '/home/colin/template_dir'
env = Environment(loader=FileSystemLoader(template_dir))

我的猜测是,由于您的路径不是以正斜杠开头,因此它的加载相对于您的应用程序而言。尝试使用模板目录的完整路径。


8
投票

最后,我正在寻找的方法要求我将模块创建到包中。我决定使用 Jinja2 的包加载器方法,因为它查找相对于包本身的模板文件,而不是相对于工作目录:

import jinja2

templateEnv = jinja2.Environment( loader=jinja2.PackageLoader('package_name', 'templates'))
template = templateEnv.get_template( 'template_filename' )
template.render({'var1':var1, 'var2':var2})
© www.soinside.com 2019 - 2024. All rights reserved.