تقديم قوالب HTML لدى استخدام المُخطّطات Blueprint في تطبيقات Flask
يُعتبر إطار العمل Flask من أشهر أطر تطوير تطبيقات الويب الخفيفة في بيئة Python، حيث يتميز ببساطته وقابليته للتوسع، مما يجعله خيارًا مثاليًا للمطورين الذين يرغبون في بناء تطبيقات مرنة وسريعة التطوير. ومن أبرز ميزاته هو نظام “Blueprints”، الذي يتيح تقسيم التطبيق إلى مكونات صغيرة قابلة لإعادة الاستخدام، تسهّل التنظيم والعمل الجماعي على مشاريع كبيرة.
واحدة من الجوانب المحورية في بناء تطبيقات ويب باستخدام Flask هي التعامل مع واجهات المستخدم أو “front-end”، والذي غالبًا ما يتم من خلال قوالب HTML. وعند استخدام الـBlueprints، يصبح من الضروري إدارة هذه القوالب بشكل منظم وفعّال لضمان فصل واضح بين مختلف مكونات التطبيق. هذا المقال يقدّم شرحًا معمّقًا وموسعًا عن كيفية تقديم قوالب HTML عند استخدام المُخطّطات Blueprint، مع التركيز على البنية الهيكلية للمشروع، إعدادات Flask، طرق استدعاء القوالب، والمسائل المتعلقة بمسارات الملفات وسهولة إدارة الواجهات في مشاريع Flask معقدة.
مفهوم الـBlueprint في Flask
قبل التطرق إلى تقديم القوالب، من المهم فهم دور الـBlueprint داخل تطبيق Flask. الـBlueprint هو كائن يُستخدم لتعريف مجموعة من المسارات (routes)، والقوالب، وملفات الاستايل والوظائف المرتبطة بجزء معين من التطبيق.
مثلاً، يمكن إنشاء مخطط خاص بصفحات المستخدم، وآخر للوحة التحكم، وثالث للمدونة، بحيث يمكن لكل مخطط أن يحتوي على ملفاته الخاصة بالقوالب والإعدادات.
هذا يتيح:
-
إعادة الاستخدام: يمكن نقل مخطط من تطبيق إلى آخر بسهولة.
-
التنظيم: فصل الوظائف المختلفة للتطبيق في ملفات مستقلة.
-
سهولة التوسع: يمكن إضافة ميزات جديدة للتطبيق دون التعديل في الملفات الأساسية.
بنية مشروع Flask باستخدام Blueprints
عند العمل مع Blueprints، يجب تصميم هيكل المشروع بطريقة تدعم التنظيم الجيد للقوالب والملفات الثابتة والمخططات. في ما يلي نموذج لبنية مثالية:
bash/myapp/
│
├── app.py
├── config.py
├── /static/
│ └── css, js, images...
├── /templates/
│ └── base.html
├── /blueprints/
│ ├── __init__.py
│ ├── /users/
│ │ ├── __init__.py
│ │ ├── routes.py
│ │ └── templates/
│ │ └── users/
│ │ ├── profile.html
│ │ └── login.html
│ └── /admin/
│ ├── __init__.py
│ ├── routes.py
│ └── templates/
│ └── admin/
│ ├── dashboard.html
│ └── settings.html
في هذا الهيكل:
-
يوجد مجلد
templatesرئيسي لتخزين القالب الأساسيbase.htmlأو القوالب المشتركة. -
لكل Blueprint مجلده الخاص ضمن
blueprints/ويحتوي على مجلدtemplates/خاص به. -
يجب أن تتبع القوالب داخل المخطط تسميات دقيقة مثل
users/profile.htmlأوadmin/dashboard.htmlلتفادي التعارض بين الأسماء.
إعداد Flask لتقديم القوالب من Blueprints
عند تعريف Blueprint في ملف __init__.py أو routes.py داخل مجلد أحد المخططات، يجب الإشارة إلى مكان القوالب الخاص به باستخدام الوسيط template_folder.
مثال على تعريف Blueprint لمخطط المستخدم:
python# blueprints/users/__init__.py
from flask import Blueprint
users_bp = Blueprint(
'users',
__name__,
template_folder='templates'
)
from . import routes
وبهذا الشكل، Flask يصبح قادرًا على البحث عن القوالب داخل المجلد blueprints/users/templates.
تسجيل Blueprints في التطبيق الرئيسي
في ملف app.py، يتم استيراد وتسجيل جميع الـBlueprints:
pythonfrom flask import Flask
from blueprints.users import users_bp
from blueprints.admin import admin_bp
app = Flask(__name__)
# تسجيل كل Blueprint
app.register_blueprint(users_bp, url_prefix='/users')
app.register_blueprint(admin_bp, url_prefix='/admin')
يتيح الوسيط url_prefix تحديد بادئة لعناوين URL الخاصة بكل مخطط، مما يساعد في تنظيم المسارات.
تقديم القوالب باستخدام render_template
بعد إعداد Blueprint وتحديد مسار مجلد القوالب الخاص به، يتم تقديم القوالب باستخدام دالة render_template بنفس الطريقة المعتادة في Flask.
مثال من داخل مخطط المستخدم:
python# blueprints/users/routes.py
from flask import render_template
from . import users_bp
@users_bp.route('/profile')
def profile():
return render_template('users/profile.html')
من المهم الإشارة إلى أن المسار داخل render_template يجب أن يتبع البنية الهرمية للمجلدات، أي يجب تضمين اسم المجلد users/ الذي يحتوي القالب.
استخدام القالب الأساسي Base Template
لتحقيق توحيد بصري وسلوكي في مختلف صفحات التطبيق، من المفيد استخدام “قالب أساسي” (base template) يُستخدم من قبل جميع القوالب الأخرى عبر آلية Jinja2 template inheritance.
مثال على القالب الأساسي:
html
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}MyApp{% endblock %}title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
head>
<body>
<header>{% block header %}{% endblock %}header>
<main>{% block content %}{% endblock %}main>
<footer>{% block footer %}© 2025 MyApp{% endblock %}footer>
body>
html>
ثم في كل قالب تابع لمخطط ما، يمكن توريث هذا القالب:
html
{% extends 'base.html' %}
{% block title %}User Profile{% endblock %}
{% block content %}
<h1>Welcome to your profileh1>
<p>User-specific content goes here.p>
{% endblock %}
مشاكل شائعة عند تقديم القوالب في Blueprints
تظهر بعض التحديات المتكررة عند استخدام Blueprints لتقديم القوالب، ومنها:
1. عدم العثور على القالب
غالبًا ما يكون السبب في هذه المشكلة هو عدم تحديد template_folder بشكل صحيح، أو عدم تضمين اسم المجلد الرئيسي داخل render_template.
2. تكرار أسماء القوالب
عند وجود أكثر من قالب بنفس الاسم في Blueprints مختلفة، يجب الحرص على تضمين المسار الكامل مثل users/login.html و admin/login.html لتفادي التعارض.
3. مشاكل في static files
يجب الحرص على وضع الملفات الثابتة (CSS، JavaScript، صور) في المجلد static/ الجذري وليس داخل كل Blueprint، لأن Flask يستخدم مسارًا مركزيًا لتقديم الملفات الثابتة عبر url_for('static', filename='...').
إنشاء جدول توضيحي لأهم العلاقات بين Blueprints والقوالب
| المكوّن | التوصيف | مثال عملي |
|---|---|---|
Blueprint |
وحدة مستقلة في التطبيق تحتوي على مسارات وقوالب | users_bp |
template_folder |
تحديد مجلد القوالب الخاص بالـBlueprint | template_folder='templates' |
render_template() |
دالة لتقديم قالب HTML باستخدام محرك Jinja2 | render_template('users/profile.html') |
base.html |
القالب الأساسي المستخدم لتوحيد التصميم | يحتوي على الهيكل العام لكل الصفحات |
url_for('static', filename=) |
لإنشاء المسار الصحيح للملفات الثابتة | url_for('static', filename='css/style.css') |
ممارسات فعالة عند استخدام Blueprints لتقديم القوالب
-
اعتماد التسلسل الهرمي للمجلدات: لتنظيم القوالب، يُفضل تضمينها داخل مجلد فرعي يحمل اسم الـBlueprint.
-
فصل واضح للقوالب: لا تضع جميع القوالب في مجلد
templates/الرئيسي لتفادي التشابك. -
تجنب التكرار: استخدم
macros.htmlلكتابة أجزاء قابلة لإعادة الاستخدام مثل نماذج الإدخال وأشرطة التنقل. -
الاستفادة من الامتدادات: مثل
Flask-BootstrapأوFlask-Themes2لتنسيق القوالب بسهولة. -
دعم الترجمة: استخدم
Flask-Babelلدعم قوالب متعددة اللغات في حال كان التطبيق دوليًا.
مصادر
-
Flask Documentation. Blueprints and Application Factories. https://flask.palletsprojects.com/en/latest/blueprints/
-
Miguel Grinberg. Flask Web Development (2nd Edition), O’Reilly Media, 2018.

