تعلم كيف تجعل تطبيقك في Flask يقدم بيانات قابلة للاستهلاك من قبل تطبيقات أخرى (مثل تطبيقات الموبايل أو المواقع الأخرى)، باستخدام واجهات API وملفات JSON.
📘 ما هي REST API؟
هي اختصار لـ Representational State Transfer Application Programming Interface
وتُستخدم لتبادل البيانات بين التطبيقات عبر الإنترنت.
مثلاً، عندما يطلب تطبيق الهاتف بيانات المستخدمين من السيرفر — السيرفر يرد بـ JSON.
⚙️ إنشاء أول API في Flask
لننشئ تطبيقًا بسيطًا يعرض بيانات المستخدمين بصيغة JSON.
📄 ملف المشروع: app.py
from flask import Flask, jsonify, request
app = Flask(__name__)
# قاعدة بيانات تجريبية (قائمة من القواميس)
users = [
{"id": 1, "name": "Ahmed", "email": "ahmed@example.com"},
{"id": 2, "name": "Sara", "email": "sara@example.com"},
{"id": 3, "name": "Omar", "email": "omar@example.com"}
]
# واجهة ترجع جميع المستخدمين
@app.route('/api/users', methods=['GET'])
def get_users():
return jsonify(users)
# واجهة ترجع مستخدم محدد حسب الـ id
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = next((u for u in users if u['id'] == user_id), None)
if user:
return jsonify(user)
return jsonify({"error": "User not found"}), 404
# واجهة لإضافة مستخدم جديد
@app.route('/api/users', methods=['POST'])
def add_user():
data = request.get_json()
new_user = {
"id": len(users) + 1,
"name": data['name'],
"email": data['email']
}
users.append(new_user)
return jsonify({"message": "User added successfully!", "user": new_user}), 201
if __name__ == '__main__':
app.run(debug=True)
🧠 شرح الكود:
@app.route('/api/users', methods=['GET'])→ ترجع قائمة المستخدمين كاملة بصيغة JSON.
@app.route('/api/users/<int:user_id>')
→ ترجع بيانات مستخدم واحد باستخدام معرّف (ID).
@app.route('/api/users', methods=['POST'])
→ تسمح بإرسال بيانات JSON من تطبيق آخر لإضافة مستخدم جديد.
🔄 كيفية التجربة:
1-شغل التطبيق:
python app.py2- افتح المتصفح وجرّب:
http://127.0.0.1:5000/api/users→ جميع المستخدمينhttp://127.0.0.1:5000/api/users/2→ المستخدم رقم 2
3- لإرسال طلب POST (إضافة مستخدم جديد)، استخدم Postman أو أي أداة API:
POST /api/users
Content-Type: application/json
{
"name": "Tamer",
"email": "tamer@example.com"
}🚀 تمرين الدرس 11:
أنشئ API جديد بعنوان /api/products يحتوي على:
واجهات:
- GET /api/products → ترجع جميع المنتجات.
- GET /api/products/ → ترجع منتج محدد.
- POST /api/products → تضيف منتج جديد.
✳️ المطلوب أيضًا أن تتحقق عند الإضافة من أن السعر price أكبر من 0
وإلا ترجع رسالة خطأ بصيغة JSON.
✅ حل تمرين الدرس 11: إنشاء REST API للمنتجات
📄 الملف: app.py
from flask import Flask, jsonify, request
app = Flask(__name__)
# قاعدة بيانات مبدئية للمنتجات
products = [
{"id": 1, "name": "Laptop", "price": 1200},
{"id": 2, "name": "Headphones", "price": 150},
{"id": 3, "name": "Smartwatch", "price": 300}
]
# 🔹 واجهة: عرض جميع المنتجات
@app.route('/api/products', methods=['GET'])
def get_products():
return jsonify(products)
# 🔹 واجهة: عرض منتج حسب الـ ID
@app.route('/api/products/<int:product_id>', methods=['GET'])
def get_product(product_id):
product = next((p for p in products if p['id'] == product_id), None)
if product:
return jsonify(product)
return jsonify({"error": "Product not found"}), 404
# 🔹 واجهة: إضافة منتج جديد
@app.route('/api/products', methods=['POST'])
def add_product():
data = request.get_json()
# تحقق من أن المفاتيح الأساسية موجودة
if 'name' not in data or 'price' not in data:
return jsonify({"error": "Missing 'name' or 'price'"}), 400
# تحقق من أن السعر موجب
if data['price'] <= 0:
return jsonify({"error": "Price must be greater than 0"}), 400
# إنشاء المنتج الجديد
new_product = {
"id": len(products) + 1,
"name": data['name'],
"price": data['price']
}
products.append(new_product)
return jsonify({"message": "Product added successfully!", "product": new_product}), 201
if __name__ == '__main__':
app.run(debug=True)
🧠 شرح الكود خطوة بخطوة:
🧩 قاعدة البيانات:
products = [
{"id": 1, "name": "Laptop", "price": 1200},
{"id": 2, "name": "Headphones", "price": 150},
{"id": 3, "name": "Smartwatch", "price": 300}
]
هي مجرد قائمة من القواميس (مثل جدول مؤقت داخل الذاكرة).
🔹 عرض جميع المنتجات:
@app.route('/api/products', methods=['GET'])
def get_products():
return jsonify(products)
ترجع كل المنتجات في صيغة JSON مثل:
[
{"id": 1, "name": "Laptop", "price": 1200},
{"id": 2, "name": "Headphones", "price": 150}
]
🔹 عرض منتج محدد:
@app.route('/api/products/<int:product_id>', methods=['GET'])
def get_product(product_id):
product = next((p for p in products if p['id'] == product_id), None)
if product:
return jsonify(product)
return jsonify({"error": "Product not found"}), 404- يبحث عن المنتج داخل القائمة.
- إذا لم يجده → يرجع رسالة خطأ مع كود 404.
🔹 إضافة منتج جديد:
@app.route('/api/products', methods=['POST'])
def add_product():
data = request.get_json()
if 'name' not in data or 'price' not in data:
return jsonify({"error": "Missing 'name' or 'price'"}), 400
if data['price'] <= 0:
return jsonify({"error": "Price must be greater than 0"}), 400
new_product = {
"id": len(products) + 1,
"name": data['name'],
"price": data['price']
}
products.append(new_product)
return jsonify({"message": "Product added successfully!", "product": new_product}), 201
🔧 طريقة التجربة
شغّل السيرفر:
python app.pyافتح المتصفح أو استخدم أداة مثل Postman أو curl.GET http://127.0.0.1:5000/api/productsلعرض منتج واحد:GET http://127.0.0.1:5000/api/products/2لإضافة منتج جديد:
POST http://127.0.0.1:5000/api/products
Content-Type: application/json
{
"name": "Keyboard",
"price": 250
}💡 ناتج الإضافة الناجحة:
{
"message": "Product added successfully!",
"product": {
"id": 4,
"name": "Keyboard",
"price": 250
}
}
🎯 نصائح إضافية:
- يمكنك مستقبلاً ربط هذه البيانات بقاعدة بيانات حقيقية مثل SQLite أو MySQL.
- يمكنك حماية الواجهات باستخدام رموز تحقق (API Keys).
- يمكنك فصل الكود في ملفات مختلفة (routes – models – app).

