मैं एक ब्राउज़र के बजाय पायथन में एक फ़ाइल के लिए jinja2 आउटपुट कैसे प्रस्तुत करूं


86

मेरे पास एक jinja2 टेम्पलेट (.html फ़ाइल) है जिसे मैं प्रस्तुत करना चाहता हूं (टोकन को मेरी py फ़ाइल से मानों के साथ बदलें)। हालांकि, प्रदान किए गए परिणाम को एक ब्राउज़र पर भेजने के बजाय, मैं इसे एक नई .html फ़ाइल में लिखना चाहता हूं। मुझे लगता है कि समाधान भी एक django टेम्पलेट के लिए समान होगा।

मैं यह कैसे कर सकता हूँ?

जवाबों:


129

इस जैसे किसी और के बारे में क्या राय है?

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('test.html')
output_from_parsed_template = template.render(foo='Hello World!')
print(output_from_parsed_template)

# to save the results
with open("my_new_file.html", "w") as fh:
    fh.write(output_from_parsed_template)

test.html

<h1>{{ foo }}</h1>

उत्पादन

<h1>Hello World!</h1>

यदि आप एक रूपरेखा का उपयोग कर रहे हैं, जैसे कि फ्लास्क, तो आप अपने देखने के नीचे, वापसी से पहले ऐसा कर सकते थे।

output_from_parsed_template = render_template('test.html', foo="Hello World!")
with open("some_new_file.html", "wb") as f:
    f.write(output_from_parsed_template)
return output_from_parsed_template

त्वरित प्रतिक्रिया के लिए धन्यवाद। अगर मैं सही तरीके से समझ रहा हूं, तो अपने पहले स्निपिट को: jinja2 इंपोर्ट एनवायरनमेंट से, FileSystemLoader env = Environment (लोडर = FileSystemLoader ('टेम्प्लेट))) टेम्पलेट = env.get_tarsplate (' test.html ') output_from_parsed_template = template.render (फू) = 'हैलो वर्ल्ड!') प्रिंट आउटपुट_फ्रेम_पार्स्ड_टमप्लेट मैं प्रिंट लाइन को किसी तरह की फाइल राइट लाइन के साथ बदल सकता था। क्या वो सही है? फ़ाइल को लिखने के लिए इस तरह की लाइन क्या दिख सकती है? पुन। फ्लास्क, यह एक बड़े ऐप का एक छोटा सा हिस्सा है, इसलिए मुझे नहीं पता कि क्या मैं एक फ्रेमवर्क का उपयोग कर पाऊंगा।
बिल जी।

स्पष्टीकरण के लिए धन्यवाद। मुझे आखिरकार यह कोशिश करने का मौका मिला। प्रारंभ में मुझे एक त्रुटि मिली "ऐसी कोई फ़ाइल या निर्देशिका नहीं: 'my_new_file.html'"। जाहिरा तौर पर फ़ाइल पहले से मौजूद है। मैंने तब टेम्पलेट फ़ाइल की प्रतिलिपि बनाई और इसे 'my_new_file.html' नाम दिया। अब मुझे एक त्रुटि मिलती है: IOError: फ़ाइल लेखन के लिए नहीं खुली। क्या ऐसा हो सकता है क्योंकि मैं Google App Engine में विकास कर रहा हूं?
बिल जी।

@BillG। नहीं, यह मेरी ओर से एक त्रुटि थी। उपरोक्त परिवर्तन का प्रयास करें: को बदल दिया rbगया wb
सिरप

शीघ्र जवाब देने के लिए ध्न्यवाद। मैंने rb को wb में बदल दिया और अब मुझे निम्न त्रुटि मिलती है: IOError: अमान्य मोड: wb
बिल जी।

)नीचे कोड अनुभाग में पहली पंक्ति के अंत में एक लापता है । मैं इसे जोड़ने की कोशिश कर रहा था, लेकिन SO को संपादन के लिए> 6 अक्षर (मूर्खतापूर्ण सीमा) की आवश्यकता होती है ..
egeland


8

इसलिए टेम्प्लेट लोड करने के बाद, आप रेंडर कॉल करते हैं और फिर आउटपुट को फाइल में लिखते हैं। 'के साथ' बयान एक संदर्भ प्रबंधक है। इंडेंटेशन के अंदर आपके पास 'f' नामक ऑब्जेक्ट जैसी एक खुली फाइल होती है।

template = jinja_environment.get_template('CommentCreate.html')     
output = template.render(template_values)) 

with open('my_new_html_file.html', 'w') as f:
    f.write(output)

तो, यह कुछ इस तरह दिखेगा: TEMPLATE_DIR = os.path.join (os.path.dirname ( फ़ाइल ), 'टेम्प्लेट') jinja_environment = \ jinja2.Environment (autoescape = False, लोडर = jinja2.FileSystemLoader (TEMPLATE_DIR) = jinja_environment.get_template ('CommentCreate.html') self.response.out.write (template.render (template_values)) ओपन के साथ ('my_new_html_free.html', 'w') f :write (response.content) के रूप में जहां पहले से ही आबादी है, जहां template_values। कृपया आवश्यकतानुसार सही करें। धन्यवाद।
बिल जी।

स्पष्टीकरण के लिए धन्यवाद। मुझे आखिरकार यह प्रयास करने का मौका मिला। प्रारंभ में मुझे एक त्रुटि मिली "ऐसी कोई फ़ाइल या निर्देशिका नहीं: 'my_new_file.html'"। जाहिरा तौर पर फ़ाइल पहले से मौजूद है। मैंने तब टेम्पलेट फ़ाइल की प्रतिलिपि बनाई और इसे 'my_new_file.html' नाम दिया। अब मुझे एक त्रुटि मिलती है: IOError: फ़ाइल लेखन के लिए नहीं खुली। क्या ऐसा हो सकता है क्योंकि मैं Google App Engine में विकास कर रहा हूं?
बिल जी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.