Flask 101: الدليل الشامل لتعلم فريمورك Flask لتطوير تطبيقات الويب بلغة بايثون
تطوير تطبيقات الويب هو أحد المجالات الأكثر طلباً في عالم البرمجة اليوم، ويعد إطار العمل Flask من أشهر وأبسط الفريموركات التي تستخدم لغة بايثون لإنشاء تطبيقات ويب قوية ومرنة. في هذا المقال سنقدم شرحًا تفصيليًا وشاملًا عن Flask، بداية من المفاهيم الأساسية، مرورًا ببناء تطبيقات ويب بسيطة، وصولاً إلى الموضوعات المتقدمة التي تساعد المطورين على بناء تطبيقات احترافية.
ما هو Flask؟
Flask هو إطار عمل ويب (Web Framework) مكتوب بلغة بايثون، يتميز بخفته وبساطته، وهو يعتمد على بنية تسمى “الميكروفريمورك” (Microframework). هذا يعني أن Flask لا يحتوي على الكثير من الميزات الجاهزة التي تقدمها أطر العمل الكبيرة مثل Django، ولكنه يوفر الأساسيات فقط، ما يمنحه مرونة كبيرة للمطورين لبناء تطبيقاتهم بالطريقة التي يريدونها.
تم تطوير Flask لأول مرة عام 2010 بواسطة Armin Ronacher، ويستند على مكتبة Werkzeug لتسهيل التعامل مع طلبات HTTP، وJinja2 التي هي محرك قوالب (Template Engine) يتيح تصميم صفحات HTML ديناميكية.
لماذا Flask؟
هناك أسباب كثيرة جعلت Flask يحظى بشعبية واسعة بين مطوري بايثون، منها:
-
بساطته ومرونته: يمكن للمطورين البدء بسرعة وبدون تعقيد، مع إمكانية إضافة المكونات التي يحتاجونها فقط.
-
سهولة التعلم: مقارنة بالأطر الكبيرة، Flask يقدم طريقة تعلم سلسة لمن يريد البدء في تطوير الويب بلغة بايثون.
-
مكتبة ضخمة من الإضافات: على الرغم من أنه إطار خفيف، إلا أنه يحتوي على نظام إضافات (Extensions) قوي يسمح بإضافة الميزات مثل قواعد البيانات، التوثيق، إدارة الجلسات، وغيرها.
-
مناسب لتطبيقات صغيرة ومتوسطة: Flask مثالي لإنشاء تطبيقات ويب صغيرة، واجهات برمجية (APIs)، وحتى التطبيقات الكبيرة عند التخطيط والتنظيم الصحيح.
الهيكلية الأساسية لتطبيق Flask
عند إنشاء تطبيق Flask بسيط، عادةً ما تكون بنية المشروع على الشكل التالي:
bash/my_flask_app /static /templates app.py
-
app.py: الملف الرئيسي الذي يحتوي على كود التطبيق.
-
templates/: مجلد خاص بملفات القوالب HTML.
-
static/: مجلد مخصص لملفات الـ CSS، الصور، وجافاسكريبت.
هذه الهيكلية البسيطة تساعد في الفصل بين منطق التطبيق، تصاميم الصفحات، والموارد الثابتة.
بدء أول تطبيق باستخدام Flask
للبدء مع Flask، أولاً يجب تثبيته باستخدام أداة إدارة الحزم pip:
bashpip install Flask
بعد التثبيت، يمكن إنشاء ملف app.py يحتوي على الكود التالي:
pythonfrom flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "مرحبًا بكم في أول تطبيق Flask!"
if __name__ == '__main__':
app.run(debug=True)
شرح سريع للكود:
-
استيراد فئة
Flaskمن مكتبة flask. -
إنشاء كائن
appيمثل تطبيق الويب. -
تعريف مسار (Route) رئيسي
'/'يستجيب بطباعة نص بسيط. -
تشغيل التطبيق على الخادم المحلي مع تفعيل خاصية التصحيح (Debug).
عند تشغيل هذا التطبيق (python app.py)، يمكن الوصول إلى الموقع على العنوان http://127.0.0.1:5000/.
مفهوم الراوتنج (Routing)
الراوتنج هو الطريقة التي يحدد بها التطبيق أي كود يتم تنفيذه بناءً على عنوان URL الذي يزوره المستخدم. في Flask يتم استخدام الديكوريتور @app.route() لتحديد العنوان والمسار الذي يستجيب له التطبيق.
مثال لإضافة راوت جديد:
python@app.route('/about')
def about():
return "هذه صفحة حول الموقع"
الراوتنج يدعم أيضًا المتغيرات الديناميكية داخل الرابط، مثلاً:
python@app.route('/user/' )
def show_user(username):
return f"مرحبًا {username}"
هنا عند زيارة /user/ahmed سيتم عرض النص “مرحبًا ahmed”.
التعامل مع قوالب HTML باستخدام Jinja2
لتقديم صفحات ويب تحتوي على محتوى ديناميكي وجميل، يستخدم Flask محرك القوالب Jinja2. يمكن حفظ ملفات HTML داخل مجلد templates واستخدامها في التطبيق.
مثال على قالب home.html داخل مجلد templates:
htmlhtml>
<html lang="ar">
<head>
<meta charset="UTF-8">
<title>الصفحة الرئيسيةtitle>
head>
<body>
<h1>مرحبًا {{ name }}!h1>
body>
html>
داخل التطبيق يمكن استدعاء هذا القالب وتمرير بيانات له كالآتي:
pythonfrom flask import render_template
@app.route('/')
def home():
return render_template('home.html', name='الزائر الكريم')
سيتم استبدال {{ name }} في القالب بالكلمة التي تم تمريرها من التطبيق.
التعامل مع الطلبات (Requests) والردود (Responses)
Flask يوفر مجموعة أدوات للتعامل مع طلبات المستخدم (GET, POST, PUT, DELETE) ومعالجة البيانات المرسلة.
مثال بسيط لصفحة بها نموذج (Form) يرسل بيانات باستخدام طريقة POST:
pythonfrom flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
return f"تم تسجيل الدخول باسم {username}"
return '''
'''
في هذا المثال، عند إرسال النموذج بالبيانات، يعالج التطبيق الطلب ويعرض اسم المستخدم.
إدارة الجلسات (Sessions) وحفظ البيانات المؤقتة
في تطبيقات الويب، أحيانًا يحتاج المطور إلى حفظ بيانات مؤقتة مرتبطة بالمستخدم، مثل تسجيل الدخول، تفضيلات المستخدم، أو العربة الشرائية.
Flask يدعم ذلك من خلال جلسات (Sessions) قائمة على ملفات الكوكيز. لتفعيلها، يجب تعيين مفتاح سري:
pythonapp.secret_key = 'your_secret_key'
مثال تخزين قيمة في الجلسة:
pythonfrom flask import session
@app.route('/set/')
def set_session():
session['username'] = 'ahmed'
return 'تم تعيين اسم المستخدم'
@app.route('/get/')
def get_session():
username = session.get('username', 'غير معروف')
return f'اسم المستخدم هو {username}'
التعامل مع قواعد البيانات
Flask لا يأتي مدمجًا مع نظام قواعد بيانات، لكنه يدعم ربط أي قاعدة بيانات من خلال مكتبات إضافية. أشهر هذه المكتبات هي Flask-SQLAlchemy التي تربط Flask مع مكتبة SQLAlchemy الشهيرة.
لتثبيت الإضافة:
bashpip install Flask-SQLAlchemy
مثال على ربط قاعدة بيانات SQLite وإنشاء جدول مستخدمين:
pythonfrom flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
db.create_all()
@app.route('/add/' )
def add_user(username):
user = User(username=username)
db.session.add(user)
db.session.commit()
return f'تم إضافة المستخدم {username}'
التعامل مع ملفات الستاتيك (Static Files)
تطبيقات الويب تحتاج لعرض ملفات ثابتة مثل الصور، ملفات CSS، وجافاسكريبت. Flask يفترض وجود مجلد باسم static يحتوي على هذه الملفات.
يمكن الوصول إلى هذه الملفات داخل القوالب باستخدام الدالة url_for:
html<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
بناء RESTful APIs باستخدام Flask
Flask يمكن استخدامه لبناء واجهات برمجية (APIs) التي تسمح لتطبيقات أخرى بالتفاعل مع التطبيق.
مثال API بسيط يعيد بيانات بصيغة JSON:
pythonfrom flask import jsonify
@app.route('/api/users')
def api_users():
users = [{'id': 1, 'name': 'Ahmed'}, {'id': 2, 'name': 'Sara'}]
return jsonify(users)
إضافة ميزات وأدوات متقدمة
Flask يمكن توسيعه بسهولة باستخدام الإضافات، ومن أشهرها:
-
Flask-Login: لإدارة عمليات تسجيل الدخول والخروج.
-
Flask-Migrate: لتحديث قواعد البيانات بشكل آمن باستخدام Alembic.
-
Flask-WTF: لتسهيل التعامل مع النماذج (Forms) والتحقق من صحتها.
-
Flask-Mail: لإرسال البريد الإلكتروني من داخل التطبيق.
نصائح لتطوير تطبيقات Flask متقدمة
-
تنظيم الكود: في المشاريع الكبيرة، من الأفضل تقسيم التطبيق إلى حزم (Packages) متعددة، وتقسيم الملفات مثل النماذج، الراوتات، الإضافات.
-
التعامل مع الأخطاء: يجب تعريف صفحات مخصصة للأخطاء مثل 404 و500 لتحسين تجربة المستخدم.
-
الأمان: يجب استخدام إعدادات الحماية مثل CSRF protection، تشفير كلمات المرور، واستخدام HTTPS.
-
الأداء: يمكن تحسين أداء التطبيق باستخدام تخزين مؤقت (Caching)، وضغط المحتوى، وتحسين قواعد البيانات.
مقارنة Flask مع أطر عمل أخرى
| الخاصية | Flask | Django | FastAPI |
|---|---|---|---|
| نوع الفريمورك | ميكروفريمورك خفيف | فريمورك كامل (Full-stack) | فريمورك حديث للـ APIs |
| سهولة التعلم | عالية | متوسطة إلى عالية | متوسطة إلى عالية |
| الأداء | جيد جداً | جيد | ممتاز |
| مرونة البناء | عالية | أقل مرونة بسبب الكثرة | عالية |
| دعم RESTful API | جيد مع إضافات | جيد جداً | ممتاز (مبني على Starlette) |
| مجتمع الدعم | كبير ومتنامي | ضخم جداً | سريع النمو |
ملخص
Flask هو إطار عمل ويب متكامل لكنه بسيط، يسمح للمطورين بإنشاء تطبيقات ويب ومواقع ديناميكية بسهولة ومرونة. من خلال الاعتماد على مكتبات بايثون القوية، يمكن لـ Flask تلبية مختلف احتياجات تطوير الويب، بدءًا من المشاريع الصغيرة وحتى التطبيقات الكبيرة والمعقدة. يوفر Flask البيئة المثالية للمبرمجين الذين يرغبون في السيطرة الكاملة على بنية تطبيقاتهم، مع الحفاظ على سرعة وسهولة التطوير.
المراجع
-
موقع Flask الرسمي: https://flask.palletsprojects.com
-
كتاب “Flask Web Development” لـ Miguel Grinberg
هذا المقال يغطي الجوانب الأساسية والمتقدمة لـ Flask، مما يجعل من السهل للمطورين العرب فهمه والبدء في استخدامه لبناء تطبيقات الويب المتميزة.

