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?
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