2012-08-08 16 views
52

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

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

+0

क्या आप कुछ ढांचे में जिन्जा 2 का उपयोग कर रहे हैं, या अकेले अकेले हैं? – sberry

उत्तर

88

इस तरह कुछ कैसे?

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", "wb") 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 
+1

बहुत बेहतर anwser :-) – aychedee

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। मैं सही ढंग से समझ रहा है, तो आपकी पहली SNIPPIT रहे हैं: jinja2 आयात पर्यावरण से , FileSystemLoader env = पर्यावरण (लोडर = FileSystemLoader ('टेम्पलेट्स')) टेम्पलेट = env.get_template ('test.html') output_from_parsed_template = template.render (foo = 'हैलो वर्ल्ड!') प्रिंट output_from_parsed_template मैं प्रिंट लाइन को किसी प्रकार की फ़ाइल लिखने वाली रेखा से बदल सकता हूं। क्या वो सही है? फ़ाइल में लिखने के लिए ऐसी रेखा क्या हो सकती है? पुन:। फ्लास्क, यह एक बड़े ऐप का एक छोटा सा हिस्सा है, इसलिए मुझे नहीं पता कि मैं एक ढांचे का उपयोग करने में सक्षम हूं या नहीं। –

+0

@ बिलग: उपरोक्त संपादन देखें। स्पष्टीकरण के लिए – sberry

3

तो टेम्पलेट लोड करने के बाद, आप रेंडर कॉल करते हैं और फिर आउटपुट को फ़ाइल में लिखते हैं। 'साथ' कथन एक संदर्भ प्रबंधक है। इंडेंटेशन के अंदर आपके पास '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) 
+0

तो, क्या यह कुछ ऐसा दिखाई देगा: TEMPLATE_DIR = os.path.join (os.path.dirname (__ file__), 'टेम्पलेट्स') jinja_environment = \ jinja2. पर्यावरण (autoescape = गलत, लोडर = jinja2 .FileSystemLoader (TEMPLATE_DIR)) टेम्पलेट = jinja_environment.get_template खुला ('my_new_html_file.html' के साथ ('CommentCreate.html') self.response.out.write (template.render (template_values)) , 'मौ') एफ: f.write (respond.content) जहां टेम्पलेट_वैल्यू पहले से ही आबादी वाले हैं। कृपया आवश्यकतानुसार सही करें। धन्यवाद। –

+0

रुको, मुझे अपना जवाब थोड़ा सा संपादित करें ... – aychedee

+0

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

0

sberry और aychedee काम से जवाब से ऊपर, मैं केवल f.close जोड़ने के लिए किया था ()। अन्यथा आपको अपनी निर्देशिका में अपनी फ़ाइल नहीं मिल सकती है।

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