Flask و Jinja2: تمپلیت‌سازی پیشرفته برای وب

فهرست مطالب

“`html





Flask و Jinja2: تمپلیت‌سازی پیشرفته برای وب



Flask و Jinja2: تمپلیت‌سازی پیشرفته برای وب

در دنیای توسعه وب مدرن، ایجاد صفحات وب پویا و تعاملی نیازمند ابزارهایی قدرتمند و کارآمد است. Flask، یک میکروفریم‌ورک وب پایتون، به همراه Jinja2، یک موتور تمپلیت‌سازی انعطاف‌پذیر، ترکیبی ایده‌آل برای توسعه‌دهندگان وب فراهم می‌آورند. این مقاله به بررسی عمیق Flask و Jinja2، نحوه استفاده از آن‌ها برای تمپلیت‌سازی پیشرفته و ایجاد صفحات وب پویا می‌پردازد.

1. مقدمه‌ای بر Flask و Jinja2

Flask یک میکروفریم‌ورک وب برای پایتون است که ابزارهای ضروری برای ساخت برنامه‌های کاربردی وب را فراهم می‌کند، بدون آنکه انتخاب‌ها و انعطاف‌پذیری زیادی را از توسعه‌دهنده سلب کند. این فریم‌ورک به دلیل سادگی، انعطاف‌پذیری و قابلیت گسترش بالا، انتخابی محبوب برای توسعه‌دهندگان است.

Jinja2 یک موتور تمپلیت‌سازی مدرن و قدرتمند برای پایتون است. این موتور تمپلیت به توسعه‌دهندگان اجازه می‌دهد تا HTML، XML یا سایر فرمت‌های متنی را با استفاده از متغیرها، عبارات و ساختارهای کنترلی پویا تولید کنند. Jinja2 به طور خاص برای جداسازی منطق برنامه از ظاهر آن طراحی شده است، که این امر باعث می‌شود کد تمیزتر، قابل نگهداری‌تر و تست‌پذیرتر شود.

ترکیب Flask و Jinja2 به توسعه‌دهندگان امکان می‌دهد تا به سرعت و به آسانی صفحات وب پویا ایجاد کنند. Flask مسئولیت مدیریت درخواست‌ها و مسیریابی را بر عهده دارد، در حالی که Jinja2 وظیفه تولید HTML و ارائه داده‌ها به کاربر را بر عهده دارد.

2. نصب و پیکربندی Flask و Jinja2

برای شروع کار با Flask و Jinja2، ابتدا باید آن‌ها را نصب کنید. می‌توانید این کار را با استفاده از pip، مدیریت بسته پایتون، انجام دهید:

pip install Flask Jinja2

پس از نصب، می‌توانید یک برنامه Flask پایه ایجاد کنید که از Jinja2 برای ارائه تمپلیت‌ها استفاده کند. در اینجا یک مثال ساده آورده شده است:


from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    name = "John Doe"
    return render_template('index.html', name=name)

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

در این مثال، یک برنامه Flask ایجاد شده است که یک مسیر (/) را تعریف می‌کند. هنگامی که کاربر به این مسیر دسترسی پیدا می‌کند، تابع index() اجرا می‌شود. این تابع از render_template() برای ارائه تمپلیت index.html استفاده می‌کند و متغیر name را با مقدار “John Doe” به تمپلیت ارسال می‌کند.

برای اینکه این مثال کار کند، باید یک فایل تمپلیت به نام index.html در یک پوشه به نام templates در کنار فایل پایتون خود ایجاد کنید. محتوای این فایل می‌تواند به شکل زیر باشد:





    Welcome


    

Hello, {{ name }}!

در این تمپلیت، {{ name }} یک عبارت Jinja2 است که مقدار متغیر name را نمایش می‌دهد. هنگامی که Flask تمپلیت را ارائه می‌کند، این عبارت با مقدار “John Doe” جایگزین می‌شود.

3. متغیرها و عبارات در Jinja2

یکی از قدرتمندترین ویژگی‌های Jinja2، امکان استفاده از متغیرها و عبارات در تمپلیت‌ها است. متغیرها به شما اجازه می‌دهند تا داده‌ها را از برنامه Flask خود به تمپلیت‌ها ارسال کنید، در حالی که عبارات به شما اجازه می‌دهند تا عملیات مختلفی را روی این داده‌ها انجام دهید.

3.1. دسترسی به متغیرها

همانطور که در مثال قبلی دیدیم، می‌توانید از نحو {{ variable_name }} برای دسترسی به متغیرها در تمپلیت‌ها استفاده کنید. Jinja2 به طور خودکار متغیرهای ارسال شده از برنامه Flask را شناسایی می‌کند و آن‌ها را در تمپلیت در دسترس قرار می‌دهد.

همچنین می‌توانید به ویژگی‌ها و عناصر یک شیء یا لیست دسترسی پیدا کنید:

  • {{ user.name }}: دسترسی به ویژگی name یک شیء user
  • {{ users[0] }}: دسترسی به اولین عنصر یک لیست users
  • {{ users['name'] }}: دسترسی به مقدار کلید name در یک دیکشنری users

3.2. عبارات

Jinja2 از عبارات مختلفی پشتیبانی می‌کند که به شما اجازه می‌دهند تا عملیات مختلفی را روی داده‌ها انجام دهید. برخی از این عبارات عبارتند از:

  • عملگرهای ریاضی: +, -, *, /, %
  • عملگرهای مقایسه‌ای: ==, !=, >, <, >=, <=
  • عملگرهای منطقی: and, or, not
  • عملگرهای تست: is (برای بررسی نوع یا ویژگی یک متغیر)

به عنوان مثال، می‌توانید از عبارات برای انجام محاسبات، مقایسه مقادیر یا بررسی نوع یک متغیر استفاده کنید:


The total is: {{ price * quantity }}

{% if age >= 18 %}

You are an adult.

{% else %}

You are a minor.

{% endif %} {% if user is defined %}

Welcome, {{ user.name }}!

{% endif %}

4. فیلترها در Jinja2

فیلترها توابعی هستند که می‌توانند برای تغییر شکل یا قالب‌بندی داده‌ها در تمپلیت‌ها استفاده شوند. Jinja2 مجموعه‌ای از فیلترهای داخلی را ارائه می‌دهد و همچنین به شما اجازه می‌دهد تا فیلترهای سفارشی خود را تعریف کنید.

4.1. فیلترهای داخلی

Jinja2 شامل فیلترهای داخلی مختلفی است که برای انجام عملیات رایج مانند تغییر حروف، قالب‌بندی اعداد و تاریخ‌ها، و فرار از کاراکترهای ویژه استفاده می‌شوند. برخی از فیلترهای پرکاربرد عبارتند از:

  • capitalize: اولین حرف رشته را بزرگ می‌کند.
  • lower: تمام حروف رشته را به حروف کوچک تبدیل می‌کند.
  • upper: تمام حروف رشته را به حروف بزرگ تبدیل می‌کند.
  • title: اولین حرف هر کلمه را بزرگ می‌کند.
  • trim: فاصله‌های خالی ابتدا و انتهای رشته را حذف می‌کند.
  • striptags: تگ‌های HTML را از رشته حذف می‌کند.
  • safe: رشته را به عنوان HTML امن علامت‌گذاری می‌کند (برای جلوگیری از فرار خودکار).
  • default: مقدار پیش‌فرض را در صورتی که متغیر تعریف نشده باشد، برمی‌گرداند.
  • length: طول یک رشته یا تعداد عناصر یک لیست را برمی‌گرداند.
  • format: رشته را با استفاده از قالب‌بندی مشخص‌شده، قالب‌بندی می‌کند.
  • date: تاریخ را با استفاده از قالب‌بندی مشخص‌شده، قالب‌بندی می‌کند.

برای استفاده از یک فیلتر، کافی است از نحو {{ variable_name | filter_name }} استفاده کنید:


Name: {{ name | capitalize }}

Email: {{ email | lower }}

Price: {{ price | format('$.2f') }}

Date: {{ date | date('%Y-%m-%d') }}

4.2. فیلترهای سفارشی

اگر فیلترهای داخلی نیازهای شما را برآورده نمی‌کنند، می‌توانید فیلترهای سفارشی خود را تعریف کنید. برای این کار، باید یک تابع پایتون ایجاد کنید که داده‌ها را به عنوان ورودی دریافت کند و داده‌های تغییریافته را به عنوان خروجی برگرداند. سپس، باید این تابع را به عنوان یک فیلتر به برنامه Flask خود اضافه کنید:


from flask import Flask, render_template

app = Flask(__name__)

def reverse_string(s):
    return s[::-1]

app.jinja_env.filters['reverse'] = reverse_string

@app.route('/')
def index():
    text = "Hello, world!"
    return render_template('index.html', text=text)

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

در این مثال، یک تابع به نام reverse_string() تعریف شده است که یک رشته را معکوس می‌کند. سپس، این تابع به عنوان یک فیلتر به نام reverse به برنامه Flask اضافه شده است. اکنون می‌توانید از این فیلتر در تمپلیت‌ها استفاده کنید:


Original text: {{ text }}

Reversed text: {{ text | reverse }}

5. حلقه‌ها در Jinja2

حلقه‌ها به شما اجازه می‌دهند تا یک بلوک از کد را به ازای هر عنصر در یک لیست یا دیکشنری تکرار کنید. Jinja2 از ساختار for برای ایجاد حلقه‌ها استفاده می‌کند.

برای مثال، فرض کنید یک لیست از کاربران دارید که می‌خواهید نام و ایمیل هر کاربر را نمایش دهید:


users = [
    {'name': 'John Doe', 'email': 'john.doe@example.com'},
    {'name': 'Jane Smith', 'email': 'jane.smith@example.com'},
    {'name': 'Peter Jones', 'email': 'peter.jones@example.com'}
]

می‌توانید از یک حلقه for در تمپلیت برای پیمایش این لیست و نمایش اطلاعات هر کاربر استفاده کنید:


    {% for user in users %}
  • Name: {{ user.name }}
    Email: {{ user.email }}
  • {% endfor %}

در داخل حلقه for، می‌توانید به متغیرهای ویژه زیر دسترسی داشته باشید:

  • loop.index: اندیس فعلی حلقه (شروع از 1).
  • loop.index0: اندیس فعلی حلقه (شروع از 0).
  • loop.first: True اگر این اولین تکرار حلقه باشد.
  • loop.last: True اگر این آخرین تکرار حلقه باشد.
  • loop.length: تعداد کل تکرارهای حلقه.

برای مثال، می‌توانید از loop.first و loop.last برای اعمال استایل‌های مختلف به اولین و آخرین آیتم در لیست استفاده کنید:


    {% for user in users %} Name: {{ user.name }}
    Email: {{ user.email }} {% endfor %}

6. ماکروها در Jinja2

ماکروها توابع قابل استفاده مجدد در تمپلیت‌ها هستند. آن‌ها به شما اجازه می‌دهند تا بلوک‌های کد را تعریف کنید که می‌توانند با پارامترهای مختلف فراخوانی شوند.

برای تعریف یک ماکرو، از ساختار macro استفاده کنید:


{% macro input(name, type='text', value='') %}
    
{% endmacro %}

این ماکرو یک فیلد ورودی HTML با نوع، نام و مقدار مشخص‌شده ایجاد می‌کند. برای فراخوانی یک ماکرو، از ساختار call استفاده کنید:


{{ input('username', type='email') }}
{{ input('password', type='password') }}

می‌توانید ماکروها را در فایل‌های جداگانه تعریف کنید و سپس آن‌ها را در تمپلیت‌های دیگر import کنید. این کار باعث می‌شود کد شما سازمان‌یافته‌تر و قابل نگهداری‌تر شود. برای import یک ماکرو، از ساختار import استفاده کنید:


{% import 'macros.html' as macros %}

{{ macros.input('username', type='email') }}

7. وراثت تمپلیت در Jinja2

وراثت تمپلیت یک الگوی طراحی است که به شما اجازه می‌دهد تا یک تمپلیت پایه (base template) ایجاد کنید که شامل عناصر مشترک مانند هدر، فوتر و ساختار کلی صفحه باشد. سپس، می‌توانید تمپلیت‌های فرزند (child templates) ایجاد کنید که از تمپلیت پایه ارث بری می‌کنند و محتوای خاص خود را در مناطق مشخص‌شده (blocks) ارائه می‌دهند.

برای تعریف یک تمپلیت پایه، از ساختار block استفاده کنید:





    {% block title %}My Website{% endblock %}


    
{% block header %}

My Website

{% endblock %}
{% block content %}

Default content.

{% endblock %}
{% block footer %} © 2023 My Website {% endblock %}

در این تمپلیت پایه، سه بلاک به نام‌های title، header و content تعریف شده‌اند. هر یک از این بلاک‌ها می‌توانند در تمپلیت‌های فرزند بازنویسی شوند.

برای ایجاد یک تمپلیت فرزند که از تمپلیت پایه ارث بری می‌کند، از ساختار extends استفاده کنید:


{% extends 'base.html' %}

{% block title %}
    Home Page
{% endblock %}

{% block content %}
    

Welcome to the home page!

This is the content of the home page.

{% endblock %}

در این تمپلیت فرزند، تمپلیت base.html به عنوان تمپلیت پایه مشخص شده است. سپس، بلاک‌های title و content بازنویسی شده‌اند تا محتوای خاص خود را ارائه دهند. بلاک header در تمپلیت فرزند بازنویسی نشده است، بنابراین محتوای آن از تمپلیت پایه به ارث می‌رسد.

وراثت تمپلیت به شما اجازه می‌دهد تا کد خود را به طور موثرتری سازماندهی کنید و از تکرار کد جلوگیری کنید. این الگو به ویژه برای برنامه‌های کاربردی وب بزرگ و پیچیده مفید است.

8. نکات پیشرفته و بهترین практики

  • استفاده از Sandbox: Jinja2 Sandbox امکان اجرای تمپلیت‌ها در یک محیط امن را فراهم می‌کند. این ویژگی به ویژه برای برنامه‌هایی که به کاربران اجازه می‌دهند تا تمپلیت‌ها را وارد کنند، مفید است.
  • بهینه‌سازی عملکرد: Jinja2 به طور پیش‌فرض تمپلیت‌ها را کش می‌کند. با این حال، می‌توانید با استفاده از ویژگی‌هایی مانند autoescape و cache، عملکرد را بهینه‌سازی کنید.
  • استفاده از extension‌ها: Jinja2 extension‌های مختلفی را ارائه می‌دهد که قابلیت‌های جدیدی را به موتور تمپلیت اضافه می‌کنند.
  • آزمایش تمپلیت‌ها: اطمینان حاصل کنید که تمپلیت‌های خود را به طور کامل آزمایش می‌کنید تا از صحت و امنیت آن‌ها اطمینان حاصل کنید.

9. منابع و مراجع

امیدواریم این راهنمای جامع به شما کمک کند تا با Flask و Jinja2 به طور موثرتری کار کنید و صفحات وب پویا و تعاملی ایجاد کنید.



```

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

"با شرکت در این دوره جامع و کاربردی، به راحتی مهارت‌های برنامه‌نویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر می‌سازد تا به سرعت الگوریتم‌های پیچیده را درک کرده و اپلیکیشن‌های هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفه‌ای و امکان دانلود و تماشای آنلاین."

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان