2016-06-22 27 views
5

Şablonları oluşturmak için Jinja2'yi kullanarak SQL sorguları oluşturma ve yürütme işlemlerini yürüten bir modülüm var. Modülün kendisi ve 'şablonlar' adlı bir dizin ağdaki birden fazla makineden erişebileceğim bir ağ sürücüsünde yer almaktadır.Jinja2, çalışma dizininden ayrı konumdan yükleme şablonları

Her şey beklendiği gibi aynı dizinden çalıştığımda çalışır.

Bu modülü ayrı bir konumdan yüklemeye çalıştığımda ve TemplateNotFound: hata alıyorum. hatayı içeren çizgi ile kendisini şöyle fonksiyonu vurgulanan:

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 

başarısız Bu fonksiyon aşağıdaki satırı geçerli: Ben FileSystemLoader fonksiyonu çağırdığınızda düşünüyorum

env = Environment(loader=FileSystemLoader('templates')) 

, onu aramaya oluyor Çalışma klasörüne göre şablon klasörü için. Şablon dizini modül konumunun kendisine göre aramak için nasıl ayarlayabilirim?

cevap

2

Sonuçta aradığım yöntem, modül (ler) leri bir paket halinde oluşturmamı gerektirdi.

import jinja2 

templateEnv = jinja2.Environment(loader=jinja2.PackageLoader('package_name', 'templates')) 
template = templateEnv.get_template('template_filename') 
template.render({'var1':var1, 'var2':var2}) 
3

Bu benim için çalışıyor:

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

Benim tahminim Yolunuz ile başlamaz olarak ileri uygulamanıza onun yükleme göreli çizgi olmasıdır. Şablon dizininin tam yolunu kullanmayı deneyin.

+0

Bu tam bir kaç nedenden dolayı sorunu çözmek için gitmiyor: şablon çalışma dizinine paketin kendisi göreli ziyade göreli dosyaları arar çünkü jinja2 paket yükleyici yöntemini kullanmaya karar: 1. Linux ve Windows makinelerinden şablon dizinine erişmem gerekiyor. Her iki durumda da bir if ifadesi koyabilirim. 2. Modülleri/meslektaşlarımı çevrimdışı olarak çalışmak istedikleri ve ağa erişemedikleri için meslektaşları ile paylaşmak istiyorum. Bunun yerine, tüm modüllerimi bir paket halinde topladım ve jinja.PackageLoader() kullandım. – cbcoutinho