फाइल सिस्टम से सीधे jinja टेम्प्लेट लोड कैसे करें


85

Pocoo.org पर जिंजा एपीआई दस्तावेज़ कहता है:

जिनजा 2 को आपके एप्लिकेशन के लिए टेम्प्लेट लोड करने के लिए कॉन्फ़िगर करने का सबसे सरल तरीका लगभग इसी तरह दिखता है:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
यह डिफ़ॉल्ट सेटिंग्स और लोडर के साथ एक टेम्प्लेट वातावरण बनाएगा, जो कि टेम्प्लेट फ़ोल्डर में टेम्प्लेट्स को आपरिप्लेशन पायथन पैकेज के अंदर दिखता है।

जैसा कि यह पता चला है, यह इतना आसान नहीं है क्योंकि आपको इसमें अपने टेम्पलेट के साथ एक अजगर पैकेज बनाना / स्थापित करना है, जो बहुत सारी अनावश्यक जटिलता का परिचय देता है, खासकर यदि आपका अपना कोड वितरित करने का कोई इरादा नहीं है। आप यहां और यहां के विषय पर SO प्रश्नों का उल्लेख कर सकते हैं , लेकिन उत्तर अस्पष्ट और असंतोषजनक हैं।

एक भोला नौसिखिया क्या करना चाहता है, जाहिर है, सिर्फ टेम्पलेट को सीधे फाइलसिस्टम से लोड करना है, न कि किसी पैकेज में संसाधन के रूप में। यह कैसे किया जाता है?

जवाबों:


124

यहां बताया गया है : a के FileSystemLoaderबजाय का उपयोग करें PackageLoader। मुझे यहां और यहां वेब पर उदाहरण मिले । मान लें कि आपके पास अपने टेम्पलेट के समान एक अजगर फ़ाइल है:

./index.py
./template.html

यह index.py टेम्पलेट ढूंढेगा और उसे रेंडर करेगा:

#!/usr/bin/python
import jinja2

templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "template.html"
template = templateEnv.get_template(TEMPLATE_FILE)
outputText = template.render()  # this is where to put args to the template renderer

print(outputText)

यह पता चला है, jinja2 API डॉक में एक खंड है जो सभी अंतर्निहित लोडर पर चर्चा करता है , इसलिए यह उस तरह का शर्मनाक है जिस पर तुरंत ध्यान नहीं दिया गया है। लेकिन परिचय ऐसे शब्द है जो PackageLoaderलगता है कि डिफ़ॉल्ट, "सरलतम" विधि है। नए लोगों के लिए अजगर के लिए, यह एक जंगली हंस का पीछा कर सकता है।


94
हास्यास्पद की तरह आप एक फाइल से एक लाइन में टेम्पलेट लोड नहीं कर सकते हैं जैसेjinja2.load_template('template.html')
मैट

4
मेरे पास हमेशा एक आवरण होता है जिसे मैं अपने अनुप्रयोगों में जिनजा 2 कहता हूं जहां मैं यह सब क्रिया करता हूं, फिर इसे कॉल करता Jinja2.render(template_name, data)
हूं

11
महत्वपूर्ण सुरक्षा जोखिम! आप लगभग निश्चित रूप से कॉल करना चाहते हैं jinja2.Environment(loader=templateLoader, autoescape=True)। या अधिक जानकारी के लिए एपीआई डॉक्स देखें । बस मुझे पता चला कि मैं इस उत्तर का पालन करने से एक बड़ी XSS भेद्यता के साथ समाप्त हो गया: /
andrewdotn

शीर्ष पर दोनों लिंक टूटे हुए हैं।
15

76

एक सरल तरीका सीधे निर्माता को कॉल करने jinj2.Templateऔर openफ़ाइल को लोड करने के लिए उपयोग करना है:

from jinja2 import Template
with open('template.html.jinja2') as file_:
    template = Template(file_.read())
template.render(name='John')

1
दुर्भाग्य से यह कस्टम फ़िल्टर स्थापित करने की अनुमति नहीं देता है। टेम्प्लेट लोडिंग आरंभ के दौरान एक त्रुटि उत्पन्न करता है क्योंकि कस्टम फ़िल्टर अभी तक मौजूद नहीं है। और इस तरह से आपको आरंभीकरण के बाद केवल पर्यावरण (फिल्टर को शामिल करने के लिए) तक पहुंच है।
रॉन पैक्सो

17

यहाँ एक लाइनर है:

template = Template(open('template_file.j2').read())

फिर आप किसी अन्य लाइन पर या एक लाइन में सभी के लिए टेम्पलेट रेंडर कर सकते हैं:

rendered = Template(open('template_file.j2').read()).render(var="TEXT")

1
अफसोस की बात है कि अगर टेम्पलेट विरासत में है तो यह टूट जाएगा, क्योंकि जिनजा को संदर्भित टेम्पलेट नहीं मिलेंगे।
बेम्मू

3
लेकिन सौभाग्य से यह सरल और पर्याप्त है यदि आप वंशानुक्रम का उपयोग नहीं करते हैं, और उदाहरण के लिए कुछ सरल ईमेल भेजने के लिए नहीं चाहते हैं .. :)
smido

2

यदि Python 3.4+ और Jinja2 - v2.11 + का उपयोग किया जाता है - तो हम प्रवाह को सरल बनाने के लिए अजगर के pathlib और Filesystem को जोड़ सकते हैं

from pathlib import Path
...

p = Path(__file__).parent.parent / 'templates' # sample relative path
env = Environment(
    loader=FileSystemLoader(Path(p)))
template = env.get_template('your_file.jinja2')

मैं सीधे उपयोग करने के साथ सहज नहीं हूं Template(file)क्योंकि जिंजा का टेम्पलेट वंशानुक्रम प्रसंस्करण अच्छी तरह से काम नहीं कर सकता है।

Pathlib समर्थन केवल जिन्जा के नवीनतम संस्करण में जोड़ा गया है - v2.11 +

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.