2016-06-22 39 views
5

我有一個模塊可以通過使用Jinja2來呈現模板來處理創建和執行SQL查詢。模塊本身和名爲「模板」的目錄位於網絡驅動器上,我可以從網絡上的多臺機器訪問該驅動器。Jinja2從工作目錄之外的單獨位置加載模板

當我按照預期在同一個目錄中工作時,一切都正常。

當我嘗試從一個單獨的位置加載和使用此模塊時,出現TemplateNotFound:錯誤。函數本身看起來像這樣,與包含錯誤的行強調:

from jinja2 import Environment, FileSystemLoader, Template, meta 

def get_sql_query(position): 
    filename = "PositionDelta.sqltemplate" 

    # Create Jinja2 Environment, using the 'templates' folder 
Error here --> env = Environment(loader=FileSystemLoader('templates')) 
    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功能,它的搜索爲相對於工作文件夾的模板文件夾。我怎樣才能將它設置爲查找相對於模塊位置本身的模板目錄?

回答

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}) 
3

這個工作對我來說:

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

我的猜測是,由於你的路徑沒有以一個相對於你的應用程序加載其正斜槓。嘗試使用模板目錄的完整路徑。

+0

這不正是要解決的一對夫婦的原因問題: 1.我需要從Linux和Windows機器訪問模板目錄。我可以在這裏爲這兩種情況寫一個if語句。 2.我希望與同事分享模塊,以便他們/我想脫機工作並且無法訪問網絡。相反,我只是將所有模塊收集到一個包中,並使用jinja.PackageLoader() - 查看答案 – cbcoutinho