সরাসরি ফাইল সিস্টেম থেকে জিনজা টেমপ্লেট কীভাবে লোড করা যায়


87

Pocoo.org এ Jinja এপিআই ডকুমেন্ট পদ বলে:

আপনার অ্যাপ্লিকেশনটির জন্য টেমপ্লেটগুলি লোড করার জন্য জিনজা 2 কনফিগার করার সহজ উপায়টি দেখতে প্রায় এই রকম দেখাচ্ছে:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
এটি ডিফল্ট সেটিংস এবং একটি লোডার দিয়ে টেমপ্লেট পরিবেশ তৈরি করবে যা ইউর্যাপ্লিকেশন পাইথন প্যাকেজের অভ্যন্তরে টেম্পলেট ফোল্ডারে টেম্পলেটগুলি সন্ধান করে ।

দেখা যাচ্ছে, এটি এত সহজ নয় কারণ আপনাকে এতে আপনার টেমপ্লেটগুলি দিয়ে একটি পাইথন প্যাকেজ তৈরি / ইনস্টল করতে হবে, যা প্রচুর অনর্থক জটিলতার পরিচয় দেয়, বিশেষত যদি আপনার কোড বিতরণ করার কোনও ইচ্ছা নেই। আপনি এখানে এবং এখানে এই বিষয়ের উপর এসও প্রশ্নগুলি উল্লেখ করতে পারেন তবে উত্তরগুলি অস্পষ্ট এবং অসন্তুষ্ট।

একজন নিষ্পাপ নবাগত কি করতে চায়, স্পষ্টতই কেবল ফাইল সিস্টেম থেকে টেম্পলেটটি লোড করা হয়, প্যাকেজের কোনও সংস্থান হিসাবে নয়। এটি কিভাবে হয়?

উত্তর:


129

এখানে কীভাবে রয়েছে : এরFileSystemLoader পরিবর্তে একটি ব্যবহার করুন PackageLoader। আমি ওয়েবে এখানে এবং এখানে উদাহরণ পেয়েছি । আসুন ধরা যাক আপনার টেমপ্লেটের মতো একই ধীরে একটি অজগর ফাইল রয়েছে:

./index.py
./template.html

এই সূচি.পি টেমপ্লেটটি আবিষ্কার করবে এবং এটি রেন্ডার করবে:

#!/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)

দেখা যাচ্ছে, জিনজা 2 এপিআই ডকটিতে একটি বিভাগ রয়েছে যা সমস্ত বিল্ট-ইন লোডারদের নিয়ে আলোচনা করে , তাই এখনই এটি লক্ষ্য না করা বিব্রতকর of তবে পরিচিতিটি এমন শব্দযুক্ত PackageLoaderযা ডিফল্ট বলে মনে হয়, "সহজতম" পদ্ধতি। আগন্তুকের আগতদের জন্য, এটি বুনো হংসের তাড়া করতে পারে।


96
হাস্যকর বিষয় অনুসারে বাছাই করুন আপনি কোনও লাইনের কোনও ফাইল থেকে কোনও টেম্পলেট লোড করতে পারবেন নাjinja2.load_template('template.html')
ম্যাট

4
আমার সর্বদা একটি র‍্যাপার থাকে যা আমি কেবল আমার অ্যাপ্লিকেশনগুলিতে জিনজা 2 কে ফোন করি যেখানে আমি এই সমস্ত ভার্বোসটি রেখেছি, তারপরে এটিকে কল করুন:Jinja2.render(template_name, data)
সেরাফ

11
গুরুত্বপূর্ণ নিরাপত্তা ঝুঁকি! আপনি প্রায় কল করতে চান jinja2.Environment(loader=templateLoader, autoescape=True)। অথবা আরও তথ্যের জন্য এপিআই ডক্স দেখুন। এই উত্তরটি অনুসরণ
করেই

শীর্ষে দুটি লিঙ্কই নষ্ট হয়ে গেছে।
11:25

77

একটি সহজ উপায় হ'ল সরাসরি jinj2.Templateকনস্ট্রাক্টরকে কল করা এবং openফাইলটি লোড করার জন্য ব্যবহার করা:

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

4
দুর্ভাগ্যক্রমে এটি কাস্টম ফিল্টার সেট আপ করতে দেয় না। টেমপ্লেট লোড শুরু করার সময় একটি ত্রুটি উত্পন্ন করে কারণ কাস্টম ফিল্টারটি এখনও বিদ্যমান নেই। এবং এই ভাবে আপনার আরম্ভ করার পরে কেবল পরিবেশে (ফিল্টার অন্তর্ভুক্ত করতে) অ্যাক্সেস রয়েছে।
রোনান পাইক্সিও

18

এখানে একটি লাইনার:

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

তারপরে আপনি অন্য লাইনে টেমপ্লেটটি রেন্ডার করতে পারবেন বা সমস্ত লাইনের জন্য:

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

4
দুর্ভাগ্যক্রমে এটি যদি টেম্পলেট উত্তরাধিকার থাকে তবে এটি ভেঙে যাবে, কারণ জিনজা রেফারেন্সযুক্ত টেম্পলেটগুলি সন্ধান করতে সক্ষম হবে না।
বেমমু

4
তবে ভাগ্যক্রমে এটি সহজ এবং যথেষ্ট যদি আপনি উত্তরাধিকার ব্যবহার না করেন, এবং উদাহরণস্বরূপ কিছু সাধারণ ইমেল প্রেরণ করতে চান না .. :)
স্মিডো

5

পাইথন ৩.৪+ এবং জিনজা ২ - ভি ২.১১ + ব্যবহার করা হলে - আমরা প্রবাহকে সহজ করার জন্য পাইথনের প্যাথলিব এবং ফাইল সিস্টেম একত্রিত করতে পারি

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)জিনজার টেম্পলেট উত্তরাধিকার প্রসেসিং ভাল কাজ করতে পারে না বলে আমি সরাসরি ব্যবহার করতে স্বাচ্ছন্দ্যবোধ করি না ।

পাথলিব সমর্থনটি কেবল জিনজার সর্বশেষ সংস্করণে যুক্ত করা হয়েছে - v2.11 +

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.