2016-06-22 37 views
5

Mam moduł, który obsługuje tworzenie i wykonywanie zapytań SQL przy użyciu Jinja2 do renderowania szablonów. Sam moduł i katalog o nazwie "szablony" znajdują się na dysku sieciowym, do którego mogę uzyskać dostęp z wielu maszyn w sieci.Szablony ładowania Jinja2 z oddzielnej lokalizacji niż katalog roboczy

Wszystko działa, gdy pracuję w tym samym katalogu, zgodnie z oczekiwaniami.

Kiedy próbuję załadować i używać tego modułu z oddzielnej lokalizacji, pojawia się błąd TemplateNotFound:. Funkcja samo wygląda to z linii zawierającej błąd podświetlone: ​​

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 

Ta funkcja zawodzi jest następujący wiersz:

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

myślę gdy zgłoszę funkcja FileSystemLoader, to poszukiwania dla folderu szablonu względem folderu roboczego. Jak mogę ustawić, aby szukał katalogu szablonów względem samej lokalizacji modułu?

Odpowiedz

2

Ostatecznie poszukiwana przeze mnie metoda wymagała utworzenia modułu (modułów) w pakiecie. Postanowiłem użyć metody programu ładującego pakiety Jinja2, ponieważ szuka plików szablonu odnoszących się do samego pakietu, a nie względem katalogu roboczego:

import jinja2 

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

Działa to dla mnie:

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

Domyślam się, że ścieżka nie rozpoczyna się ukośnikiem jego ładowania w stosunku do danego zastosowania. Spróbuj użyć pełnej ścieżki do katalogu szablonów.

+0

Nie rozwiąże to problemu z kilku powodów: 1. Potrzebuję uzyskać dostęp do katalogu szablonów z komputerów z systemem Linux i Windows. Mogłabym umieścić tam instrukcję if dla obu przypadków. 2. Chcę udostępnić moduł (y) współpracownikom w przypadku, gdy chcą/chcą pracować w trybie offline i nie mają dostępu do sieci. Zamiast tego po prostu zebrałem wszystkie moje moduły w pakiet i użyłem jinja.PackageLoader() - zobacz odpowiedź – cbcoutinho