2016-06-22 8 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

अंत में, जिस विधि को मैं ढूंढ रहा था, वह आवश्यक है कि मैं अपने मॉड्यूल को पैकेज में बनाऊं।

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

यही कुछ कारण के लिए समस्या को हल करने के लिए जा रहा नहीं कर रहा है: मैं क्योंकि यह टेम्पलेट के लिए काम निर्देशिका के बजाय पैकेज ही है, के सापेक्ष रिश्तेदार फाइलें लग रहा है Jinja2 के पैकेज लोडर विधि का उपयोग करने का फैसला किया: 1. मुझे लिनक्स और विंडोज मशीनों से टेम्पलेट निर्देशिका तक पहुंचने की आवश्यकता है। मैं दोनों मामलों के लिए वहां एक कथन बयान डाल सकता था। 2. मैं इस मामले के लिए सहकर्मियों के साथ मॉड्यूल साझा करना चाहता हूं कि वे ऑफ़लाइन काम करना चाहते हैं और नेटवर्क तक पहुंच नहीं है। इसके बजाए, मैंने अपने सभी मॉड्यूल को एक पैकेज में एकत्र किया और जिन्जा का इस्तेमाल किया। पैकेज लोडर() - उत्तर देखें – cbcoutinho

संबंधित मुद्दे