Jinja2 یک موتور قالبسازی (Template Engine) سریع، انعطافپذیر و قابل توسعه است که به طور گستردهای در توسعه وب با زبان برنامهنویسی پایتون استفاده میشود. این موتور به شما اجازه میدهد تا صفحات وب دینامیک را با ترکیب کد پایتون در قالبهای HTML ایجاد کنید. به عبارت سادهتر، Jinja2 به شما کمک میکند تا ساختار ثابت یک صفحه وب را تعریف کنید و در عین حال محتوای متغیر را به صورت پویا از یک منبع داده (مانند یک پایگاه داده) دریافت و نمایش دهید.
چرا از Jinja2 استفاده میکنیم؟
- سادگی و خوانایی: سینتکس Jinja2 بسیار شبیه به پایتون است و به همین دلیل یادگیری و استفاده از آن آسان است.
- قدرت و انعطافپذیری: Jinja2 امکانات بسیاری برای کنترل منطق و ساختار قالبهای شما فراهم میکند. شما میتوانید از حلقهها، شرطها، توابع سفارشی و فیلترها استفاده کنید.
- امنیت: Jinja2 دارای مکانیزمهای امنیتی قوی برای جلوگیری از تزریق کد مخرب است.
- یکپارچگی با فریمورکها: Jinja2 به خوبی با فریمورکهای محبوب پایتون مانند Flask و Django یکپارچه میشود.
مفاهیم کلیدی در Jinja2
-
-
قالبها در Jinja2
در Jinja2، قالبها فایلهای متنی هستند که حاوی کد HTML، CSS و JavaScript همراه با تگهای Jinja2 هستند. این تگها به موتور قالب Jinja2 میگویند که چگونه محتوای قالب را با دادههای پویا ترکیب کند.
انواع تگها در Jinja2Jinja2 از سه نوع اصلی تگ استفاده میکند:
- تگهای نمایش (Variable Tags): با استفاده از دو علامت گلوله (
{{
و}}
) محتوای متغیر را نمایش میدهند. - تگهای کنترل (Control Tags): برای کنترل جریان اجرای قالب استفاده میشوند، مانند حلقهها (
{% for ... %}
) و شرطها ({% if ... %}
). - تگهای کامنت (Comment Tags): برای اضافه کردن توضیحات به قالب بدون نمایش آنها در خروجی استفاده میشوند (
{# ... #}
).
مثال ساده
HTML<!DOCTYPE html> <html> <head> <title>Hello, World!</title> </head> <body> <h1>{{ name }}</h1> <p>Your favorite color is {{ color }}.</p> </body> </html>
در این مثال،
name
وcolor
متغیرهایی هستند که در هنگام رندر شدن قالب با مقادیر واقعی جایگزین میشوند.تگهای نمایش (Variable Tags)- نمایش متغیرها:
{{ variable_name }}
- نمایش عبارات:
{{ ۲ + ۳ }}
- نمایش مقادیر تو در تو:
{{ person.name }}
تگهای کنترل (Control Tags)- حلقه
for
:Code snippet{% for item in items %} <li>{{ item }}</li> {% endfor %}
- شرط
if
:Code snippet{% if condition %} <p>Condition is true.</p> {% else %} <p>Condition is false.</p> {% endif %}
- حلقه
for
باelse
:Code snippet{% for item in items %} <li>{{ item }}</li> {% else %} <p>No items found.</p> {% endfor %}
تگهای کامنت (Comment Tags)Code snippet{# This is a comment #}
نکات مهم
- Escape: برای نمایش کاراکترهای ویژه مانند
{
و}
در خروجی، از\
استفاده کنید. - توابع داخلی: Jinja2 دارای توابع داخلی بسیاری برای قالببندی و دستکاری دادهها است.
- فیلترها: فیلترها توابعی هستند که برای دستکاری مقادیر استفاده میشوند.
- ماکروها: ماکروها توابعی هستند که در قالبها تعریف میشوند و میتوانند برای ایجاد ساختارهای قالب پیچیدهتر استفاده شوند.
با استفاده از این تگها و مفاهیم، میتوانید قالبهای پیچیده و انعطافپذیری را در Jinja2 ایجاد کنید.
- تگهای نمایش (Variable Tags): با استفاده از دو علامت گلوله (
- موتور قالب (Template Engine):
موتور قالب (Template Engine) یک نرمافزار است که به شما اجازه میدهد تا صفحات وب دینامیک را با ترکیب کد برنامهنویسی با قالبهای HTML ایجاد کنید. این موتورها به شما کمک میکنند تا ساختار ثابت یک صفحه وب را تعریف کنید و در عین حال محتوای متغیر را به صورت پویا از یک منبع داده (مانند یک پایگاه داده) دریافت و نمایش دهید.
چگونه موتورهای قالب کار میکنند؟
- تعریف قالب: شما یک قالب HTML ایجاد میکنید که حاوی تگهای مخصوص موتور قالب است. این تگها به موتور قالب میگویند که کجا باید محتوای پویا را جایگزین کند.
- ارائه دادهها: شما دادههایی را که میخواهید در قالب نمایش دهید به موتور قالب ارائه میدهید. این دادهها میتوانند از هر منبعی مانند پایگاه داده، فایلها یا حتی ورودی کاربر باشند.
- رندر کردن قالب: موتور قالب قالب را با دادههای ارائه شده ترکیب میکند و خروجی نهایی را تولید میکند. این خروجی معمولاً یک صفحه HTML است که آماده نمایش در مرورگر است.
مزایای استفاده از موتورهای قالب
- جداسازی منطق و نمایش: موتورهای قالب به شما کمک میکنند تا منطق برنامهنویسی را از نمایش جدا کنید. این باعث میشود کد شما تمیزتر، قابل نگهداریتر و قابل آزمایش آسانتر شود.
- افزایش بهرهوری: با استفاده از موتورهای قالب، میتوانید سریعتر و آسانتر صفحات وب دینامیک ایجاد کنید.
- امنیت: بسیاری از موتورهای قالب دارای مکانیزمهای امنیتی برای جلوگیری از تزریق کد مخرب هستند.
- یکپارچگی با فریمورکها: موتورهای قالب معمولاً به خوبی با فریمورکهای وب یکپارچه میشوند.
مثال ساده
HTML<!DOCTYPE html> <html> <head> <title>Hello, {{ name }}!</title> </head> <body> <p>Welcome to my website!</p> <p>Your favorite color is {{ color }}.</p> </body> </html>
در این مثال،
name
وcolor
متغیرهایی هستند که در هنگام رندر شدن قالب با مقادیر واقعی جایگزین میشوند.موتورهای قالب محبوب
- Jinja2: یک موتور قالب محبوب برای پایتون.
- Twig: یک موتور قالب برای PHP.
- Handlebars: یک موتور قالب برای JavaScript.
- Mustache: یک موتور قالب ساده و سبک وزن.
- متغیر (Variable):
متغیرها در Jinja2 به شما اجازه میدهند تا دادههای پویا را در قالبهای خود نمایش دهید. این دادهها میتوانند از هر منبعی مانند پایگاه داده، فایلها یا حتی ورودی کاربر باشند.
تعریف متغیرها
متغیرها در Jinja2 با استفاده از دو علامت گلوله (
{{
و}}
) تعریف میشوند. درون این علامتها، نام متغیر را وارد میکنید.Code snippet{{ variable_name }}
استفاده از متغیرها
پس از تعریف یک متغیر، میتوانید آن را در هر جایی از قالب خود استفاده کنید.
Code snippet<h1>{{ name }}</h1> <p>Your favorite color is {{ color }}.</p>
انواع متغیرها
Jinja2 از انواع مختلف متغیرها پشتیبانی میکند، از جمله:
- متغیرهای ساده: متغیرهایی که حاوی یک مقدار ساده هستند، مانند رشتهها، اعداد و بولینها.
- متغیرهای لیستی: متغیرهایی که حاوی یک لیست از مقادیر هستند.
- متغیرهای دیکشنری: متغیرهایی که حاوی یک دیکشنری از کلید-مقدار هستند.
- متغیرهای تو در تو: متغیرهایی که حاوی متغیرهای دیگر هستند.
دسترسی به مقادیر تو در تو
برای دسترسی به مقادیر تو در تو، از نقطه (
.
) استفاده کنید.Code snippet{{ person.name }} {{ person.address.city }}
تعریف متغیرها در قالب
شما میتوانید متغیرها را مستقیماً در قالب تعریف کنید.
Code snippet{% set name = "Alice" %} {% set age = 30 %}
انتقال متغیرها از پایتون
اگر از Jinja2 در یک برنامه پایتون استفاده میکنید، میتوانید متغیرها را از پایتون به قالب منتقل کنید.
Pythonfrom jinja2 import Template template = Template("Hello, {{ name }}!") result = template.render(name="Alice") print(result)
نکات مهم
- نام متغیرها: نام متغیرها باید با یک حرف شروع شود و میتواند شامل حروف، اعداد و زیرخط باشد.
- حساسیت به حروف: Jinja2 به حروف کوچک و بزرگ حساس است.
- استفاده از فیلترها: میتوانید از فیلترها برای دستکاری مقادیر متغیرها استفاده کنید.
با استفاده از متغیرها، میتوانید قالبهای خود را با دادههای پویا پر کنید و صفحات وب دینامیک ایجاد کنید.
-
- فیلتر (Filter):
فیلترها در Jinja2 توابعی هستند که برای دستکاری مقادیر استفاده میشوند. آنها به شما اجازه میدهند تا دادهها را قالببندی، تبدیل و فیلتر کنید.
نحوه استفاده از فیلترها
فیلترها پس از یک متغیر با استفاده از علامت لوله (
|
) استفاده میشوند.Code snippet{{ variable_name | filter_name }}
فیلترهای داخلی Jinja2
Jinja2 دارای فیلترهای داخلی بسیاری است که میتوانید استفاده کنید. برخی از فیلترهای پرکاربرد عبارتند از:
default
: مقدار پیشفرض برای یک متغیر تعیین میکند.capitalize
: حرف اول یک رشته را بزرگ میکند.lower
: تمام حروف یک رشته را کوچک میکند.upper
: تمام حروف یک رشته را بزرگ میکند.trim
: فضای خالی اضافی از ابتدا و انتهای یک رشته را حذف میکند.replace
: یک زیررشته را با زیررشته دیگری جایگزین میکند.join
: عناصر یک لیست را با یک رشته جدا میکند.length
: طول یک رشته یا لیست را برمیگرداند.int
: یک رشته را به عدد صحیح تبدیل میکند.float
: یک رشته را به عدد اعشاری تبدیل میکند.date
: یک تاریخ را قالببندی میکند.time
: یک زمان را قالببندی میکند.
مثالها
Code snippet{{ name | default("Guest") }} {{ "hello world" | capitalize }} {{ "HELLO WORLD" | lower }} {{ " hello world " | trim }} {{ "hello" | replace("hello", "goodbye") }} {{ ["apple", "banana", "orange"] | join(", ") }} {{ "۱۲۳" | int }} {{ "۳.۱۴" | float }} {{ "۲۰۲۳-۱۰-۲۰" | date("Y-m-d") }}
فیلترهای سفارشی
همچنین میتوانید فیلترهای سفارشی خود را تعریف کنید.
Pythonfrom jinja2 import Environment, Markup def highlight(text): return Markup('<mark>%s</mark>' % text) env = Environment() env.filters['highlight'] = highlight template = env.from_string("{{ text | highlight }}") result = template.render(text="This is highlighted text") print(result)
نکات مهم
- زنجیر کردن فیلترها: میتوانید چندین فیلتر را به صورت زنجیرهای استفاده کنید.
- فیلترهای سفارشی: فیلترهای سفارشی به شما اجازه میدهند تا عملیات پیچیدهتری را روی دادهها انجام دهید.
- فیلترهای داخلی: Jinja2 دارای فیلترهای داخلی بسیاری است که میتوانید برای کارهای رایج استفاده کنید.
با استفاده از فیلترها، میتوانید دادههای خود را قالببندی، تبدیل و فیلتر کنید تا خروجی دلخواه را تولید کنید.
مثال ساده
<!DOCTYPE html>
<html>
<head>
<title>Hello, {{ name }}!</title>
</head>
<body>
<p>Welcome to my website!</p>
<p>Your favorite color is {{ color }}.</p>
</body>
</html>
در این مثال، name
و color
متغیرهایی هستند که در هنگام رندر شدن قالب با مقادیر واقعی جایگزین میشوند.
کاربردهای Jinja2
-
کاربردهای Jinja2
Jinja2 یک موتور قالبسازی بسیار قدرتمند و پرکاربرد در پایتون است که برای ایجاد صفحات وب دینامیک، ایمیلها، فایلهای متنی و بسیاری از موارد دیگر استفاده میشود. در ادامه به برخی از کاربردهای مهم Jinja2 اشاره میکنیم:
۱. ایجاد صفحات وب دینامیک:
- فریمورکهای وب: Jinja2 به طور گسترده در فریمورکهای وب پایتون مانند Flask و Django استفاده میشود تا صفحات وب را بر اساس دادههای پویا تولید کند.
- نمایش اطلاعات از پایگاه داده: با استفاده از Jinja2 میتوانید دادهها را از پایگاه داده دریافت کرده و آنها را در قالب HTML نمایش دهید.
- شخصیسازی محتوا: میتوانید صفحات وب را بر اساس کاربر، دستگاه یا هر پارامتر دیگری شخصیسازی کنید.
۲. ایجاد ایمیلهای سفارشی:
- ارسال ایمیلهای تراکنشی: برای ارسال ایمیلهای تایید ثبتنام، بازیابی رمز عبور و سایر ایمیلهای مرتبط با تراکنشهای کاربر.
- ایجاد خبرنامهها: برای ارسال خبرنامههای سفارشی به کاربران.
- ارسال اعلانها: برای ارسال اعلانها در مورد رویدادهای مهم.
۳. تولید فایلهای متنی:
- تولید گزارشها: برای ایجاد گزارشهای سفارشی بر اساس دادهها.
- تولید فایلهای پیکربندی: برای ایجاد فایلهای پیکربندی برای نرمافزارهای مختلف.
- تولید اسناد: برای تولید اسناد فنی یا آموزشی به صورت خودکار.
۴. ایجاد قالبهای PDF:
- تولید صورتحسابها: برای ایجاد صورتحسابهای سفارشی برای مشتریان.
- تولید قراردادها: برای ایجاد قراردادهای حقوقی.
- تولید کارتهای ویزیت: برای ایجاد کارتهای ویزیت سفارشی.
۵. ایجاد قالبهای کد:
- تولید کد SQL: برای ایجاد عبارات SQL دینامیک.
- تولید کد JavaScript: برای ایجاد قطعات کد JavaScript سفارشی.
- تولید کد YAML: برای ایجاد فایلهای YAML پیکربندی.
۶. سایر کاربردها:
- ایجاد قالبهای XML: برای تولید فایلهای XML.
- ایجاد قالبهای Markdown: برای تولید فایلهای Markdown.
- ایجاد قالبهای LaTeX: برای تولید اسناد LaTeX.
مزایای استفاده از Jinja2:
- سادگی و خوانایی: سینتکس Jinja2 بسیار شبیه به پایتون است و به همین دلیل یادگیری و استفاده از آن آسان است.
- قدرت و انعطافپذیری: Jinja2 امکانات بسیاری برای کنترل منطق و ساختار قالبهای شما فراهم میکند.
- امنیت: Jinja2 دارای مکانیزمهای امنیتی قوی برای جلوگیری از تزریق کد مخرب است.
- یکپارچگی با فریمورکها: Jinja2 به خوبی با فریمورکهای محبوب پایتون مانند Flask و Django یکپارچه میشود.
در کل، Jinja2 یک ابزار بسیار قدرتمند و متنوع است که به شما امکان میدهد تا صفحات وب دینامیک و سایر محتواهای تولید شده را به صورت خودکار و با استفاده از قالبها ایجاد کنید.
جمعبندی
Jinja2 یک ابزار قدرتمند و ضروری برای هر توسعهدهنده وب با پایتون است. با استفاده از Jinja2 میتوانید صفحات وب زیبا و پویا ایجاد کنید و در عین حال کد خود را تمیز و قابل نگهداری نگه دارید.