Flask Templating এবং Jinja2

ফ্লাস্ক (Flask) - Web Development

265

Flask-এ Templating বা টেমপ্লেটিং হলো একটি প্রক্রিয়া যার মাধ্যমে HTML পেজে ডায়নামিক ডেটা ইনজেক্ট করা হয়। Flask Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করে, যা HTML ফাইলকে ডায়নামিকভাবে তৈরি করতে সহায়তা করে। এর মাধ্যমে আপনি আপনার HTML পেজগুলোতে Python কোড ব্যবহার করতে পারেন এবং ডেটা পাস করতে পারেন।


১. Flask Templating এর প্রাথমিক ধারণা

Flask-এ HTML টেমপ্লেট তৈরি করতে Jinja2 ইঞ্জিন ব্যবহৃত হয়, যা ডায়নামিক ডেটা ইনজেক্ট করার জন্য খুবই শক্তিশালী এবং নমনীয়। Jinja2 আপনাকে HTML ফাইলগুলোর মধ্যে control structures যেমন for লুপ, if শর্ত, এবং template inheritance ব্যবহার করার সুবিধা দেয়।

Flask Templating ব্যবহার করার সাধারণ প্রক্রিয়া

  1. HTML টেমপ্লেট তৈরি করা
    প্রথমে একটি templates/ ফোল্ডারে HTML ফাইল তৈরি করতে হবে। Flask স্বয়ংক্রিয়ভাবে এই ফোল্ডার থেকে টেমপ্লেট ফাইল খুঁজে পায়।
  2. Flask অ্যাপের মধ্যে টেমপ্লেট রেন্ডার করা
    Flask-এ render_template() ফাংশন ব্যবহার করে HTML টেমপ্লেট রেন্ডার করা হয়।

২. Jinja2 টেমপ্লেটিং

Jinja2 এর মূল বৈশিষ্ট্যসমূহ

  1. ভার্সনিং (Variables):
    Jinja2-তে আপনি ডেটা ভেরিয়েবল ইনজেক্ট করতে পারেন যা HTML পেজে প্রদর্শিত হয়।

    উদাহরণ:

    <h1>{{ title }}</h1>
    
  2. কন্ট্রোল স্ট্রাকচার (Control Structures):
    আপনি if, for, while ইত্যাদি কন্ট্রোল স্ট্রাকচার ব্যবহার করে লজিকাল ব্লক তৈরি করতে পারেন।

    উদাহরণ:

    {% if user %}
        <h2>স্বাগতম, {{ user }}!</h2>
    {% else %}
        <h2>আপনি লগ ইন করেননি</h2>
    {% endif %}
    
  3. ফিল্টার (Filters):
    ফিল্টার ব্যবহার করে আপনি ভেরিয়েবলের মান পরিবর্তন করতে পারেন, যেমন ডেটা ফরম্যাট করা।

    উদাহরণ:

    {{ user_name | capitalize }}
    
  4. লুপ (Loops):
    for লুপ ব্যবহার করে আপনি লিস্ট বা ডাটাবেস থেকে ডেটা দেখাতে পারেন।

    উদাহরণ:

    <ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
    

৩. Flask Templating উদাহরণ

ধাপ ১: Flask অ্যাপ এবং টেমপ্লেট ফাইল তৈরি করা

প্রথমে Flask অ্যাপ তৈরি করুন এবং তারপরে templates/ ফোল্ডারে একটি HTML টেমপ্লেট তৈরি করুন।

  1. app.py:

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route("/")
    def home():
        title = "Flask Templating"
        user = "John"
        items = ['Flask', 'Python', 'Jinja2']
        return render_template('home.html', title=title, user=user, items=items)
    
    if __name__ == "__main__":
        app.run(debug=True)
    
  2. templates/home.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>{{ title }}</title>
    </head>
    <body>
        <h1>স্বাগতম {{ user }}</h1>
        <p>আপনার আগ্রহের বিষয়গুলো:</p>
        <ul>
        {% for item in items %}
            <li>{{ item }}</li>
        {% endfor %}
        </ul>
    </body>
    </html>
    

ধাপ ২: Flask অ্যাপ চালানো

এখন Flask অ্যাপ চালু করার জন্য নিচের কমান্ডটি ব্যবহার করুন:

python app.py

এটি http://127.0.0.1:5000/ URL-এ অ্যাপ্লিকেশন চালু করবে। ব্রাউজারে গেলে আপনি দেখবেন:

স্বাগতম John
আপনার আগ্রহের বিষয়গুলো:
- Flask
- Python
- Jinja2

৪. Template Inheritance (টেমপ্লেট উত্তরাধিকার)

Flask-এ Template Inheritance এর মাধ্যমে আপনি একটি বেস টেমপ্লেট তৈরি করতে পারেন এবং অন্যান্য টেমপ্লেটে সেটি ইনহেরিট করতে পারেন। এর মাধ্যমে কোডের পুনরাবৃত্তি কমে এবং টেমপ্লেটগুলো আরো সংগঠিত হয়।

উদাহরণ:

  1. base.html (বেস টেমপ্লেট):

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>{% block title %}My Flask App{% endblock %}</title>
    </head>
    <body>
        <header>
            <h1>Flask অ্যাপ্লিকেশন</h1>
        </header>
    
        <main>
            {% block content %}
            {% endblock %}
        </main>
    </body>
    </html>
    
  2. home.html (ইনহেরিটেড টেমপ্লেট):

    {% extends "base.html" %}
    
    {% block title %}হোম পেজ{% endblock %}
    
    {% block content %}
    <p>স্বাগতম হোম পেজে!</p>
    {% endblock %}
    

এখানে:

  • {% extends "base.html" %}: home.html টেমপ্লেটটি base.html টেমপ্লেট থেকে ইনহেরিট করে।
  • {% block content %}: base.html টেমপ্লেটের মধ্যে যে জায়গাগুলো কাস্টমাইজ করা যাবে, সেগুলো ব্লক আকারে ঘোষণা করা হয়।

এখন, যখন home.html রেন্ডার হবে, তখন এটি base.html এর কাঠামো ব্যবহার করবে।


৫. স্ট্যাটিক ফাইল ব্যবহার

Flask টেমপ্লেটে স্ট্যাটিক ফাইল (যেমন CSS, JavaScript, ইমেজ) ব্যবহার করতে Flask static/ ফোল্ডার ব্যবহার করে। আপনি url_for() ফাংশন ব্যবহার করে স্ট্যাটিক ফাইলগুলির URL তৈরি করতে পারেন।

উদাহরণ:

  1. static/style.css:

    body {
        background-color: lightblue;
    }
    
  2. HTML টেমপ্লেটে স্ট্যাটিক ফাইল ব্যবহার:

    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
    

এখানে:

  • url_for('static', filename='style.css'): এটি static/style.css ফাইলের URL তৈরি করে।

Flask Templating এবং Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করার মাধ্যমে আপনি HTML ফাইলগুলিতে ডায়নামিক ডেটা ইনজেক্ট করতে পারেন, কন্ট্রোল স্ট্রাকচার এবং লুপ ব্যবহার করতে পারেন, এবং টেমপ্লেট উত্তরাধিকার (template inheritance) তৈরি করতে পারেন। Flask অ্যাপ্লিকেশনগুলোকে আরও ডায়নামিক এবং কাস্টমাইজড করতে এই টেমপ্লেটিং পদ্ধতি অত্যন্ত গুরুত্বপূর্ণ এবং সহজ।

Content added By

Flask একটি মাইক্রোফ্রেমওয়ার্ক হওয়ায় এটি খুবই লাইটওয়েট এবং কাস্টমাইজেবল, তবে HTML ফাইল ডায়নামিকভাবে জেনারেট করার জন্য Jinja2 নামক একটি শক্তিশালী টেমপ্লেট ইঞ্জিন ব্যবহার করে। Jinja2 টেমপ্লেট ইঞ্জিন Flask অ্যাপ্লিকেশনে HTML, XML, বা অন্যান্য ফরম্যাটের ডাইনামিক কনটেন্ট তৈরি করতে সহায়ক।


Jinja2 কী?

Jinja2 একটি পপুলার এবং শক্তিশালী টেমপ্লেট ইঞ্জিন যা Python ভিত্তিক। এটি আপনাকে HTML ফাইলের মধ্যে Python কোড মিশ্রিত করতে দেয় এবং ডায়নামিক কন্টেন্ট রেন্ডার করতে সাহায্য করে। Flask-এ Jinja2 টেমপ্লেট ইঞ্জিন স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়।

Jinja2-এর মাধ্যমে আপনি:

  • ভ্যারিয়েবলকে HTML ডকুমেন্টের মধ্যে ইনজেক্ট করতে পারবেন।
  • লজিকাল ফাংশন যেমন লুপ এবং কন্ডিশনাল স্টেটমেন্ট ব্যবহার করতে পারবেন।
  • ব্লক এবং ইনহেরিটেন্সের মাধ্যমে টেমপ্লেট গঠন করতে পারবেন।

Flask এবং Jinja2 এর সম্পর্ক

Flask একটি micro-framework, তাই এটি সহজে কাস্টমাইজ করা যায় এবং গতি ও প্রক্রিয়ার জন্য মিনি-কনফিগারেশন প্রস্তাব করে। Flask-এ HTML রেন্ডারিং এবং ডাইনামিক কনটেন্ট প্রদর্শন করার জন্য Jinja2 ব্যবহার করা হয়।

Flask render_template() ফাংশন ব্যবহার করে Jinja2 টেমপ্লেট রেন্ডারিং প্রক্রিয়াটিকে সহজ করে তোলে। এটি HTML ফাইলের মধ্যে Python ভ্যারিয়েবল পাস করতে এবং কন্ডিশনাল লজিক ইমপ্লিমেন্ট করতে সাহায্য করে।


Jinja2 এর মূল বৈশিষ্ট্য

  1. ভ্যারিয়েবল ব্যবহার
    Jinja2 টেমপ্লেটে আপনি Python ভ্যারিয়েবল ইনজেক্ট করতে পারেন।

    <h1>স্বাগতম, {{ username }}!</h1>
    

    Flask থেকে:

    @app.route("/hello/<username>")
    def hello(username):
        return render_template("hello.html", username=username)
    

    এখানে:

    • {{ username }}: Flask থেকে পাস করা username ভ্যারিয়েবলটি HTML ফাইলে রেন্ডার হবে।
  2. কন্ডিশনাল স্টেটমেন্ট
    Jinja2-এ আপনি কন্ডিশনাল লজিক ব্যবহার করতে পারেন:

    {% if user.is_authenticated %}
        <h1>স্বাগতম, {{ user.username }}!</h1>
    {% else %}
        <h1>আপনার লগইন প্রয়োজন!</h1>
    {% endif %}
    

    এখানে:

    • {% if ... %}: কন্ডিশনাল স্টেটমেন্ট যা লজিকাল চেক করে।
    • {% endif %}: কন্ডিশনাল লজিক বন্ধ করে।
  3. লুপ
    Jinja2-এ লুপ ব্যবহার করে একটি আইটেমের তালিকা বা অন্য কোনও ডেটা সংগ্রহের উপর লুপ করতে পারেন:

    <ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
    

    Flask থেকে:

    @app.route("/items")
    def items():
        items = ["আপেল", "কমলা", "কলা"]
        return render_template("items.html", items=items)
    
  4. ফিল্টার ব্যবহার
    Jinja2 বিভিন্ন ফিল্টার সরবরাহ করে যা ডেটা প্রসেসিং করতে সহায়ক। উদাহরণস্বরূপ, lower ফিল্টার ব্যবহার করে টেক্সটকে ছোট হাতের অক্ষরে রূপান্তর করতে পারেন:

    <p>{{ name | lower }}</p>
    

    এই কোডে:

    • {{ name | lower }}: name ভ্যারিয়েবলটি ছোট হাতের অক্ষরে রেন্ডার হবে।
  5. টেমপ্লেট ইনহেরিটেন্স
    Jinja2 টেমপ্লেট ইনহেরিটেন্স সিস্টেম সমর্থন করে, যা আপনার অ্যাপ্লিকেশনে একাধিক টেমপ্লেট শেয়ার করতে সাহায্য করে। উদাহরণস্বরূপ, আপনার কাছে একটি বেস টেমপ্লেট থাকতে পারে এবং অন্যান্য টেমপ্লেটগুলিতে সেই টেমপ্লেটের অংশ ব্যবহার করতে পারেন।

    base.html:

    <!DOCTYPE html>
    <html>
    <head><title>{% block title %}বেস টেমপ্লেট{% endblock %}</title></head>
    <body>
    <div class="container">
        {% block content %}এই অংশটি ডিফল্ট কন্টেন্ট{% endblock %}
    </div>
    </body>
    </html>
    

    child.html:

    {% extends "base.html" %}
    
    {% block title %}স্বাগতম পেজ{% endblock %}
    
    {% block content %}
    <h1>স্বাগতম, {{ username }}!</h1>
    {% endblock %}
    

    এখানে:

    • {% extends "base.html" %}: শিশু টেমপ্লেটের জন্য বেস টেমপ্লেট প্রসারণ করে।
    • {% block content %}: শিশু টেমপ্লেটের কাস্টম কন্টেন্ট এন্ট্রি করে।

Flask-এ Jinja2 ব্যবহার

Flask অ্যাপ্লিকেশনে Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করতে render_template() ফাংশন ব্যবহার করা হয়। এর মাধ্যমে আপনি আপনার HTML টেমপ্লেট ফাইল রেন্ডার করতে পারেন এবং তাতে ডাইনামিক ভ্যালু পাস করতে পারেন।

উদাহরণ:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/welcome/<username>")
def welcome(username):
    return render_template("welcome.html", username=username)

if __name__ == "__main__":
    app.run(debug=True)

welcome.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>স্বাগতম</title>
</head>
<body>
    <h1>স্বাগতম, {{ username }}!</h1>
</body>
</html>

এখানে:

  • render_template("welcome.html", username=username): username ভ্যারিয়েবলটি welcome.html টেমপ্লেটে পাস করা হচ্ছে।

Jinja2 একটি অত্যন্ত শক্তিশালী টেমপ্লেট ইঞ্জিন, যা Flask-এ ডাইনামিক HTML তৈরি করতে সহায়ক। এটি ভ্যারিয়েবল, কন্ডিশনাল লজিক, লুপ, ফিল্টার এবং টেমপ্লেট ইনহেরিটেন্সের মতো ফিচার প্রদান করে, যা ডাইনামিক ওয়েব পেজ তৈরির জন্য অত্যন্ত কার্যকর। Flask-এ Jinja2 ব্যবহার করে আপনি সহজেই ডাইনামিক কনটেন্ট রেন্ডার করতে পারেন, যা ওয়েব অ্যাপ্লিকেশনকে আরো শক্তিশালী এবং ব্যবহারকারী বান্ধব করে তোলে।

Content added By

Flask ব্যবহার করে আপনি HTML টেমপ্লেট তৈরি করতে এবং ডাইনামিক ডেটা রেন্ডার করতে পারেন। Flask-এ টেমপ্লেট রেন্ডারিংয়ের জন্য Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করা হয়, যা HTML কোডে Python কোডের অংশকে একত্রিত করতে সহায়ক। Jinja2 আপনাকে ডাইনামিক কনটেন্ট তৈরি করতে, লুপ চালাতে, কন্ডিশনাল স্টেটমেন্ট ব্যবহার করতে এবং আরও অনেক কিছু করতে সক্ষম করে।


১. Flask-এ টেমপ্লেট তৈরি

Flask-এ টেমপ্লেট ব্যবহারের জন্য HTML ফাইলগুলি templates/ ফোল্ডারে রাখা হয়। Flask স্বয়ংক্রিয়ভাবে templates/ ফোল্ডার থেকে টেমপ্লেট লোড করে।

ধাপ ১: ফোল্ডার স্ট্রাকচার তৈরি

flask_project/
├── app.py
└── templates/
    └── index.html

ধাপ ২: index.html টেমপ্লেট তৈরি করা

templates/ ফোল্ডারে একটি index.html ফাইল তৈরি করুন এবং এতে HTML কোড লিখুন:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flask টেমপ্লেট উদাহরণ</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>স্বাগতম, {{ name }}!</p>
</body>
</html>

এখানে:

  • {{ title }} এবং {{ name }} হলো Jinja2 টেমপ্লেট ভ্যারিয়েবল। Flask এই ভ্যারিয়েবলগুলির মান অ্যাসাইন করবে।

ধাপ ৩: Flask অ্যাপ তৈরি করা

এখন, আপনার app.py ফাইলে Flask অ্যাপটি তৈরি করুন এবং render_template() ফাংশন ব্যবহার করে টেমপ্লেট রেন্ডার করুন।

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    return render_template("index.html", title="Flask টেমপ্লেট", name="John Doe")

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • render_template() ফাংশনটি index.html টেমপ্লেট রেন্ডার করে এবং title এবং name প্যারামিটারগুলির মান টেমপ্লেটের মধ্যে পাঠায়।

ধাপ ৪: অ্যাপ চালানো

python app.py

এটি চালানোর পরে, আপনার ব্রাউজারে http://127.0.0.1:5000/ URL এ গিয়ে Flask টেমপ্লেট টেক্সট সহ স্বাগতম, John Doe! দেখতে পাবেন।


২. Data Rendering: ডাইনামিক ডেটা রেন্ডারিং

Flask আপনাকে ডাইনামিক ডেটা রেন্ডার করতে সহায়ক করে, যেমন লিস্ট বা ডিকশনারি রেন্ডার করা, কন্ডিশনাল লজিক প্রয়োগ করা, এবং আরও অনেক কিছু।

উদাহরণ ১: লিস্ট রেন্ডারিং

এখানে একটি উদাহরণ দেওয়া হলো যেখানে আমরা একটি লিস্ট HTML টেবিলে রেন্ডার করব।

index.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flask লিস্ট রেন্ডারিং</title>
</head>
<body>
    <h1>পণ্যের তালিকা</h1>
    <ul>
        {% for item in items %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
</body>
</html>

এখানে:

  • {% for item in items %}: এটি একটি Jinja2 লুপ যা items নামক লিস্টের প্রতিটি আইটেমে লুপ চালাবে।
  • {{ item }}: এটি প্রতিটি আইটেমকে HTML টেমপ্লেটের মধ্যে রেন্ডার করবে।
app.py:
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    items = ['আপেল', 'কমলা', 'কলা', 'আঙ্গুর']
    return render_template("index.html", items=items)

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • items: একটি লিস্ট, যা render_template() ফাংশনের মাধ্যমে index.html টেমপ্লেটে পাঠানো হয়েছে।

ব্রাউজারে রেন্ডারিং:

এটি ব্রাউজারে গেলে, আপনি দেখতে পাবেন:

পণ্যের তালিকা
- আপেল
- কমলা
- কলা
- আঙ্গুর

৩. Conditionals এবং Jinja2

Flask-এ টেমপ্লেট রেন্ডার করার সময় আপনি কন্ডিশনাল স্টেটমেন্ট ব্যবহার করতে পারেন, যা আপনার ডেটার উপর ভিত্তি করে HTML কন্টেন্ট শো বা হাইড করতে সহায়ক।

উদাহরণ ২: কন্ডিশনাল রেন্ডারিং

index.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flask কন্ডিশনাল উদাহরণ</title>
</head>
<body>
    <h1>স্বাগতম!</h1>
    {% if user %}
        <p>স্বাগতম, {{ user }}!</p>
    {% else %}
        <p>আপনি লগইন করেননি।</p>
    {% endif %}
</body>
</html>

এখানে:

  • {% if user %}: যদি user ভ্যারিয়েবলটি অ্যাসাইন করা থাকে, তবে "স্বাগতম, user!" মেসেজটি দেখাবে, অন্যথায় "আপনি লগইন করেননি" মেসেজটি দেখাবে।
app.py:
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    user = "John Doe"  # আপনি চাইলে এটিকে None অথবা অন্য কিছু সেট করতে পারেন
    return render_template("index.html", user=user)

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • user ভ্যারিয়েবলটি index.html টেমপ্লেটে পাঠানো হয়েছে এবং কন্ডিশনাল স্টেটমেন্টের মাধ্যমে তার মান রেন্ডার করা হয়েছে।

ব্রাউজারে রেন্ডারিং:

আপনি যদি user = "John Doe" পাঠান, তাহলে আপনি দেখতে পাবেন:

স্বাগতম, John Doe!

যদি user = None বা কিছু না দেওয়া হয়, তবে দেখাবে:

আপনি লগইন করেননি।

Flask-এ টেমপ্লেট তৈরি এবং ডেটা রেন্ডারিং অত্যন্ত শক্তিশালী। Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করে আপনি ডাইনামিক কনটেন্ট তৈরি করতে পারেন এবং ব্যবহারকারীর তথ্য বা অন্যান্য ডেটা নির্ভর করে কন্টেন্ট রেন্ডার করতে পারেন। Flask-এ টেমপ্লেট ব্যবহারের মাধ্যমে আপনি সহজেই HTML পেজগুলো ডাইনামিক ও ইন্টারঅ্যাকটিভ করতে পারেন।

Content added By

Flask-এ Loops এবং Conditionals ব্যবহার করে ডেটা প্রদর্শন করা খুবই সহজ এবং কার্যকর। Flask Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করে HTML ফাইলে Python-এর loops এবং conditionals ব্যবহার করতে পারে, যা ডাইনামিক কন্টেন্ট প্রদর্শন করতে সাহায্য করে। Jinja2 টেমপ্লেট ইঞ্জিনে Loops এবং Conditionals ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনের ডেটা আরও ইন্টারঅ্যাকটিভ এবং ডায়নামিক হতে পারে।


১. Conditionals (শর্তাধীন স্টেটমেন্ট)

Conditionals এর মাধ্যমে আপনি HTML টেমপ্লেটে শর্তাধীন লজিক প্রয়োগ করতে পারেন, যেমন যদি কোনো শর্ত পূর্ণ হয়, তাহলে একটি নির্দিষ্ট HTML অংশ প্রদর্শন হবে।

উদাহরণ:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    user = {"name": "John", "is_logged_in": True}
    return render_template("index.html", user=user)

if __name__ == "__main__":
    app.run(debug=True)

index.html টেমপ্লেট:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Conditionals Example</title>
</head>
<body>
    <h1>স্বাগতম!</h1>
    {% if user.is_logged_in %}
        <p>হ্যালো, {{ user.name }}! আপনি লগইন আছেন।</p>
    {% else %}
        <p>আপনি লগইন করেননি।</p>
    {% endif %}
</body>
</html>

এখানে:

  • {% if condition %} ... {% else %} ... {% endif %}: এটি শর্তাধীন ব্লক। যদি user.is_logged_in True হয়, তবে "আপনি লগইন আছেন" মেসেজ প্রদর্শিত হবে, আর অন্যথায় "আপনি লগইন করেননি" মেসেজ প্রদর্শিত হবে।
  • {{ user.name }}: এটি user dictionary থেকে name প্রপার্টি নিয়ে HTML তে প্রদর্শন করবে।

২. Loops (লুপ)

Flask-এ Loops ব্যবহার করে আপনি কোনো লিস্ট বা ডাটাবেস থেকে ডেটা লুপের মাধ্যমে HTML এ প্রদর্শন করতে পারেন।

উদাহরণ:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    users = [
        {"name": "John", "age": 25},
        {"name": "Mary", "age": 30},
        {"name": "Alex", "age": 22}
    ]
    return render_template("index.html", users=users)

if __name__ == "__main__":
    app.run(debug=True)

index.html টেমপ্লেট:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Loops Example</title>
</head>
<body>
    <h1>ব্যবহারকারীদের তালিকা:</h1>
    <ul>
        {% for user in users %}
            <li>{{ user.name }} - {{ user.age }} বছর</li>
        {% endfor %}
    </ul>
</body>
</html>

এখানে:

  • {% for item in list %} ... {% endfor %}: এটি একটি লুপ ব্লক, যা users লিস্টের প্রতিটি আইটেমের জন্য HTML কোড জেনারেট করবে।
  • {{ user.name }} এবং {{ user.age }}: এটি প্রতিটি ব্যবহারকারীর নাম এবং বয়স HTML তে প্রদর্শন করবে।

এই কোডটি একটি ব্যবহারকারীর নাম এবং বয়সের তালিকা তৈরি করবে।


৩. Conditionals এবং Loops একসাথে ব্যবহার

Flask-এ আপনি একই সময়ে Conditionals এবং Loops একত্রে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি লিস্টের মধ্যে শুধুমাত্র একটি নির্দিষ্ট শর্ত পূর্ণ করা ব্যবহারকারীকে দেখাতে পারেন।

উদাহরণ:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    users = [
        {"name": "John", "age": 25},
        {"name": "Mary", "age": 30},
        {"name": "Alex", "age": 22}
    ]
    return render_template("index.html", users=users)

if __name__ == "__main__":
    app.run(debug=True)

index.html টেমপ্লেট:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Conditionals and Loops</title>
</head>
<body>
    <h1>ব্যবহারকারীদের তালিকা (30 এর উপরে)</h1>
    <ul>
        {% for user in users %}
            {% if user.age > 25 %}
                <li>{{ user.name }} - {{ user.age }} বছর</li>
            {% endif %}
        {% endfor %}
    </ul>
</body>
</html>

এখানে:

  • {% for user in users %}: এটি users লিস্টের মধ্যে প্রতিটি ব্যবহারকারীর জন্য লুপ চালায়।
  • {% if user.age > 25 %}: এটি শর্ত দিয়ে চেক করে যে ব্যবহারকারীর বয়স ২৫ এর উপরে হলে তার নাম এবং বয়স তালিকাভুক্ত হবে।

এটি কেবলমাত্র ২৫ বছরের উপরে বয়সের ব্যবহারকারীদের দেখাবে।


৪. Nested Loops এবং Conditionals

Flask টেমপ্লেটে Nested Loops এবং Conditionals ব্যবহার করে আরও জটিল ডেটা প্রদর্শন করা যায়। উদাহরণস্বরূপ, আপনি একটি তালিকার মধ্যে আরেকটি তালিকা লুপ করতে পারেন।

উদাহরণ:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    users = [
        {"name": "John", "friends": ["Mike", "Tom", "Alex"]},
        {"name": "Mary", "friends": ["Sara", "Jack"]},
        {"name": "Alex", "friends": ["John", "Tom"]}
    ]
    return render_template("index.html", users=users)

if __name__ == "__main__":
    app.run(debug=True)

index.html টেমপ্লেট:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Nested Loops Example</title>
</head>
<body>
    <h1>ব্যবহারকারীদের বন্ধুদের তালিকা</h1>
    <ul>
        {% for user in users %}
            <li>{{ user.name }}:
                <ul>
                    {% for friend in user.friends %}
                        <li>{{ friend }}</li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
    </ul>
</body>
</html>

এখানে:

  • Nested Loops ব্যবহার করা হয়েছে যেখানে users লিস্টের প্রতিটি ব্যবহারকারীর জন্য আবার তাদের friends লিস্টের প্রতিটি আইটেম লুপ করা হচ্ছে।

Flask-এ Loops এবং Conditionals ব্যবহার করে ডেটা প্রদর্শন করা খুবই সহজ এবং শক্তিশালী। Jinja2 টেমপ্লেট ইঞ্জিনের মাধ্যমে আপনি ডাইনামিকভাবে HTML কোড তৈরি করতে পারেন এবং শর্ত বা লুপের মাধ্যমে ডেটা প্রসেস করতে পারেন। এটি Flask অ্যাপ্লিকেশনগুলিকে আরও ইন্টারঅ্যাকটিভ এবং ব্যবহারকারী-বান্ধব করে তোলে।

Content added By

Flask-এ Template Inheritance এবং Blocks এর মাধ্যমে আপনি HTML টেমপ্লেটগুলো পুনরায় ব্যবহারযোগ্য এবং মডুলার করতে পারেন। এই দুটি ফিচার Flask-এ Jinja2 টেমপ্লেট ইঞ্জিনের অংশ হিসেবে কাজ করে, যা আপনাকে HTML ফাইলগুলির মধ্যে সাধারণ কাঠামো বা অংশ শেয়ার করতে সাহায্য করে। এটি কোড পুনঃব্যবহারযোগ্যতা বাড়ায় এবং ডেভেলপমেন্টে অনেক সময় বাঁচায়।


১. Template Inheritance (টেমপ্লেট ইনহেরিট্যান্স)

Template Inheritance আপনাকে একটি বেস টেমপ্লেট তৈরি করতে দেয় এবং তারপর সেই বেস টেমপ্লেটকে একাধিক চাইল্ড টেমপ্লেটে ব্যবহার করতে পারবেন। এইভাবে আপনি সাধারণ কাঠামো (যেমন header, footer, sidebar ইত্যাদি) এক জায়গায় লিখে অন্য টেমপ্লেটে সহজেই ব্যবহার করতে পারেন।

উদাহরণ:

ধরা যাক আমাদের একটি বেস টেমপ্লেট থাকবে, যার নাম base.html

1.1 বেস টেমপ্লেট (base.html)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}My Flask App{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Welcome to My Website</h1>
        <nav>
            <a href="/">Home</a> |
            <a href="/about">About</a>
        </nav>
    </header>

    <div>
        {% block content %}
        <!-- Child templates will fill in the content here -->
        {% endblock %}
    </div>

    <footer>
        <p>© 2024 My Flask App</p>
    </footer>
</body>
</html>

এখানে:

  • {% block title %}: এটি একটি ব্লক, যার মধ্যে ডিফল্ট কন্টেন্ট দেওয়া হয়েছে। চাইল্ড টেমপ্লেটে এটি ওভাররাইড করা যাবে।
  • {% block content %}: এটি আরেকটি ব্লক, যেখানে মূল কন্টেন্ট থাকবে এবং এটি চাইল্ড টেমপ্লেটে পরিবর্তন করা যাবে।
1.2 চাইল্ড টেমপ্লেট (home.html)
{% extends "base.html" %}

{% block title %}Home - My Flask App{% endblock %}

{% block content %}
    <h2>Home Page</h2>
    <p>This is the home page content.</p>
{% endblock %}

এখানে:

  • {% extends "base.html" %}: চাইল্ড টেমপ্লেট base.html টেমপ্লেটটিকে ইনহেরিট করেছে।
  • {% block title %} এবং {% block content %}: চাইল্ড টেমপ্লেট এই ব্লকগুলোকে ওভাররাইড করেছে।

১.৩ Flask অ্যাপ্লিকেশনে টেমপ্লেট ইনহেরিট্যান্স ব্যবহার করা

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    return render_template("home.html")

if __name__ == "__main__":
    app.run(debug=True)

এটি / রুটে home.html টেমপ্লেট রেন্ডার করবে, এবং যেহেতু এটি base.html ইনহেরিট করছে, সেখানে থাকা header, footer ইত্যাদি অংশও দেখানো হবে।


২. Blocks (ব্লকস)

Blocks হলো একটি টেমপ্লেটের অংশ যা Template Inheritance-এর সাথে কাজ করে এবং যেখানে চাইল্ড টেমপ্লেট কন্টেন্ট প্রদান করে। ব্লকগুলির মাধ্যমে আপনি টেমপ্লেটের অংশকে ডাইনামিকভাবে পরিবর্তন করতে পারেন।

ব্লক ব্যবহার করার উপায়:

২.১ ব্লক তৈরির উদাহরণ
{% block header %}
    <h2>This is a custom header</h2>
{% endblock %}

এখানে {% block header %} একটি ব্লক তৈরি করেছে। চাইল্ড টেমপ্লেটে এই ব্লকটি ওভাররাইড করা যেতে পারে।

২.২ একমাত্র ব্লক পরিবর্তন করা
{% block content %}
    <p>Customized content goes here!</p>
{% endblock %}

এটি চাইল্ড টেমপ্লেটে ব্যবহার করার সময় কন্টেন্ট পরিবর্তন করতে ব্যবহৃত হয়।


৩. Flask অ্যাপ্লিকেশন উদাহরণ

এখন পুরো Flask অ্যাপ্লিকেশন উদাহরণ দেখলে, যেখানে base.html এবং home.html টেমপ্লেট ব্যবহার হচ্ছে।

৩.১ Flask অ্যাপ (app.py)

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    return render_template("home.html")

@app.route("/about")
def about():
    return render_template("about.html")

if __name__ == "__main__":
    app.run(debug=True)

৩.২ বেস টেমপ্লেট (base.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}My Flask App{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Welcome to My Flask Website</h1>
        <nav>
            <a href="/">Home</a> |
            <a href="/about">About</a>
        </nav>
    </header>

    <div>
        {% block content %}
        <!-- Child templates will fill in the content here -->
        {% endblock %}
    </div>

    <footer>
        <p>© 2024 My Flask App</p>
    </footer>
</body>
</html>

৩.৩ হোম টেমপ্লেট (home.html)

{% extends "base.html" %}

{% block title %}Home - My Flask App{% endblock %}

{% block content %}
    <h2>Home Page</h2>
    <p>This is the home page of my website!</p>
{% endblock %}

৩.৪ অ্যাবাউট টেমপ্লেট (about.html)

{% extends "base.html" %}

{% block title %}About Us - My Flask App{% endblock %}

{% block content %}
    <h2>About Us</h2>
    <p>This page provides information about our website.</p>
{% endblock %}

Flask-এ Template Inheritance এবং Blocks ব্যবহার করা আপনার HTML টেমপ্লেটগুলো পুনঃব্যবহারযোগ্য ও মডুলার করতে সহায়ক। এর মাধ্যমে আপনি একটি সাধারণ কাঠামো তৈরি করে বিভিন্ন পৃষ্ঠায় এটি ব্যবহার করতে পারবেন, এবং বিশেষ অংশের কন্টেন্ট পরিবর্তন করতে পারবেন। এটি অ্যাপ্লিকেশন কোডের পুনঃব্যবহারযোগ্যতা এবং রিডেবিলিটি উন্নত করে।

Content added By

Flask-এর Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করে আপনি কাস্টম টেমপ্লেট ফিল্টার তৈরি করতে পারেন। এই ফিল্টারগুলি আপনার টেমপ্লেটের মধ্যে ডাটা প্রক্রিয়া বা পরিবর্তন করতে সাহায্য করে। Flask আপনাকে টেমপ্লেট ফিল্টার তৈরি করার অনুমতি দেয়, যার মাধ্যমে আপনি ডাইনামিক ডেটা প্রসেস করতে পারেন।


Custom Template Filter তৈরি করার প্রক্রিয়া

Flask-এ কাস্টম ফিল্টার তৈরি করতে @app.template_filter() ডেকোরেটর ব্যবহার করা হয়। এই ফিল্টারটি টেমপ্লেটে ব্যবহার করা যেতে পারে, যেখানে আপনি ডাটা বা ভ্যারিয়েবলকে একটি কাস্টম ফিল্টারের মাধ্যমে প্রক্রিয়াজাত করবেন।

১. Custom Filter তৈরি করা

উদাহরণ:

ধরা যাক, আপনি একটি ফিল্টার তৈরি করতে চান যা একটি স্ট্রিংকে পলিনড্রোম (palindrome) চেক করবে। প্রথমে Flask অ্যাপের মধ্যে একটি কাস্টম ফিল্টার তৈরি করা হবে।

from flask import Flask
app = Flask(__name__)

# কাস্টম টেমপ্লেট ফিল্টার তৈরি
@app.template_filter('reverse_string')
def reverse_string(s):
    return s[::-1]

@app.route("/")
def home():
    return "Welcome to Flask!"

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • @app.template_filter('reverse_string') ডেকোরেটর দিয়ে একটি নতুন ফিল্টার তৈরি করা হয়েছে যা স্ট্রিংকে উল্টো করে দেয়।
  • reverse_string(s) ফাংশনটি স্ট্রিং s কে উল্টো করে।

২. টেমপ্লেট ফিল্টার ব্যবহার করা

আপনার টেমপ্লেট ফাইলে এই কাস্টম ফিল্টারটি ব্যবহার করতে পারেন।

উদাহরণ:

HTML টেমপ্লেট (e.g. index.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Custom Filter Example</title>
</head>
<body>
    <h1>{{ "hello" | reverse_string }}</h1>
</body>
</html>

এখানে:

  • {{ "hello" | reverse_string }}: এই লাইনটি কাস্টম ফিল্টারটি ব্যবহার করে "hello" স্ট্রিংটি উল্টো করে দেখাবে। আউটপুট হবে "olleh"

৩. কাস্টম ফিল্টার যা স্ট্রিং ফরম্যাট করবে

ধরা যাক, আপনি একটি ফিল্টার তৈরি করতে চান যা স্ট্রিংয়ে ক্যাপিটালাইজ (capitalize) অথবা লোয়ারকেস (lowercase) করতে পারে।

# কাস্টম ফিল্টার যা স্ট্রিংকে ক্যাপিটালাইজ করবে
@app.template_filter('capitalize_string')
def capitalize_string(s):
    return s.capitalize()

# কাস্টম ফিল্টার যা স্ট্রিংকে লোয়ারকেস করবে
@app.template_filter('lowercase_string')
def lowercase_string(s):
    return s.lower()

HTML টেমপ্লেট:

<p>{{ "hello world" | capitalize_string }}</p>   <!-- আউটপুট: Hello world -->
<p>{{ "HELLO WORLD" | lowercase_string }}</p>    <!-- আউটপুট: hello world -->

৪. কাস্টম ফিল্টার যা সংখ্যা ফরম্যাট করবে

একটি কাস্টম ফিল্টার তৈরি করা যা সংখ্যাকে একটি নির্দিষ্ট ফরম্যাটে রূপান্তর করবে, যেমন দশমিকের পর সংখ্যা সীমিত করা।

@app.template_filter('format_decimal')
def format_decimal(value, decimal_places=2):
    try:
        return f"{value:.{decimal_places}f}"
    except ValueError:
        return value

HTML টেমপ্লেট:

<p>{{ 123.4567 | format_decimal(2) }}</p>   <!-- আউটপুট: 123.46 -->
<p>{{ 123.4567 | format_decimal(3) }}</p>   <!-- আউটপুট: 123.457 -->

এখানে:

  • format_decimal(2) ফিল্টারটি সংখ্যাটিকে দশমিকের পরে দুটি অংকে রূপান্তর করবে।

৫. ফিল্টারের আর্গুমেন্ট ব্যবহার

Flask-এ কাস্টম ফিল্টার তৈরির সময় আপনি ফিল্টারে আর্গুমেন্টও পাস করতে পারেন। এই আর্গুমেন্টটি ফিল্টার ফাংশনের মাধ্যমে প্রসেস করা হবে।

উদাহরণ:

@app.template_filter('truncate_string')
def truncate_string(s, max_length):
    if len(s) > max_length:
        return s[:max_length] + '...'
    return s

HTML টেমপ্লেট:

<p>{{ "This is a very long string." | truncate_string(10) }}</p>

এখানে:

  • truncate_string(10) ফিল্টারটি স্ট্রিংটির দৈর্ঘ্য 10 ক্যারেকটার পর্যন্ত কাটবে এবং শেষে ... যোগ করবে।

আউটপুট:

This is a...

৬. কাস্টম ফিল্টারের জন্য ডিফল্ট মান নির্ধারণ করা

Flask-এ আপনি ফিল্টার তৈরির সময় ডিফল্ট মান নির্ধারণ করতে পারেন, যাতে ফিল্টারটি কখনও ব্যর্থ না হয়।

উদাহরণ:

@app.template_filter('safe_divide')
def safe_divide(a, b=1):
    try:
        return a / b
    except ZeroDivisionError:
        return "Cannot divide by zero"

এখানে:

  • b=1 ডিফল্ট মান ব্যবহার করা হয়েছে যাতে যদি দ্বিতীয় আর্গুমেন্ট সরবরাহ না করা হয় তবে ফিল্টারটি স্বয়ংক্রিয়ভাবে 1 দিয়ে ভাগ করবে।

Flask-এ কাস্টম টেমপ্লেট ফিল্টার তৈরি করা খুবই সহজ এবং শক্তিশালী। এটি আপনাকে আপনার টেমপ্লেটের মধ্যে ডেটা প্রক্রিয়া বা পরিবর্তন করার জন্য বিশেষ ফিল্টার তৈরি করতে সহায়ক হয়। কাস্টম ফিল্টার তৈরি করার মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের টেমপ্লেটের কার্যকারিতা আরও বাড়াতে পারেন এবং পুনরায় ব্যবহারযোগ্য কোড তৈরি করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...