وبلاگ
Flask و Jinja2: تمپلیتسازی پیشرفته برای وب
فهرست مطالب
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
0 تا 100 عطرسازی + (30 فرمولاسیون اختصاصی حامی صنعت)
Claude & GPT Credit – API | IDE | n8n
خرید کردیت API برای Claude و GPT با امکان استفاده در IDE و n8n. مناسب برنامهنویسی، تولید محتوا، تحلیل داده و ساخت اتوماسیون؛ راهنمای اتصال و پشتیبانی حامی صنعت همراه سفارش ارائه میشود. مدل و مقدار اعتبار را پیش از خرید بررسی کنید و برای دریافت کردیت API اقدام کنید.
اکانت Leonardo.ai با 8500 کردیت
خرید اکانت ChatGPT Plus یک ماهه با کردیت CODEX اختصاصی
خرید اکانت Gemini Pro و Gemini Advanced ۱۸ ماهه اختصاصی (تضمین فعالسازی)
خرید اکانت Gemini Pro و Gemini Advanced هجدهماهه با فعالسازی روی ایمیل شخصی و پشتیبانی حامی صنعت. مناسب تولید محتوا، برنامهنویسی، تحلیل فایل و استفاده از ابزارهای هوش مصنوعی گوگل. شرایط فعالسازی را مطالعه کنید و برای سفارش اقدام کنید.
دایرکت اتوماتیک اینستاگرام حامی | اشتراک ۳۰روزه یک پیج
اشتراک ۳۰روزه پنل دایرکت اتوماتیک اینستاگرام حامی برای یک پیج؛ پاسخ خودکار کامنت و دایرکت، کمپین کلمه کلیدی، قفل فالو، جذب لید، دکمه و لینک و گزارش تحلیل پیج. پاسخهای ثابت بدون نیاز به هوش مصنوعی کار میکنند و اتصال OpenAI Compatible اختیاری است. همین حالا اشتراک پنل اینستاگرام را تهیه کنید و راهاندازی را از داخل پنل فارسی شروع کنید.
دوره آموزش Flutter و برنامه نویسی Dart [پروژه محور]
دوره جامع آموزش برنامهنویسی پایتون + هک اخلاقی [با همکاری شاهک]
دوره جامع آموزش فرمولاسیون لوازم آرایشی
دوره جامع علم داده، یادگیری ماشین، یادگیری عمیق و NLP
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 %}
در این تمپلیت پایه، سه بلاک به نامهای 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 را مشاهده کنید.