البرمجة

استخدام قوالب HTML في Flask

تقديم قوالب 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:

python
from 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 لدعم قوالب متعددة اللغات في حال كان التطبيق دوليًا.


مصادر