خطوات إنشاء تطبيق REST API باستخدام Flask وقاعدة بيانات SQLite

في هذا الدليل، سنتعلم كيفية إنشاء واجهة برمجة تطبيقات REST بسيطة باستخدام إطار العمل Flask، مع دمج قاعدة بيانات SQLite لتخزين البيانات بشكل دائم. سيتناول المقال كيفية إعداد تطبيق Flask، إنشاء طرق (routes) لإجراء عمليات CRUD  من إنشاء وقراءة وتعديل وحذف من قاعدة البيانات، وكيفية اختبار الـ API باستخدام أدوات مثل curl . في النهاية، سيكون لديك واجهة برمجة تطبيقات API تعمل بالكامل وقادرة على التعامل مع البيانات ضمن قاعدة بيانات، وسننشئ التطبيق الخاص بنا على خادم أبونتو. 



المتطلبات

قبل البدء في هذا الدليل، تأكد من توفر التالي:

1. خادم Ubuntu يعمل مع صلاحيات sudo.

2. فهم أساسي لبرمجة Python.

3. إصدار Python 3.7 أو أحدث مثبت على نظام Ubuntu.

4. إلمام بالأوامر الأساسية لسطر الأوامر.

الخطوة 1: إعداد بيئة Flask على Ubuntu

أولًا، نحتاج للتأكد من أنك قد قمت بتثبيت Python 3 على نظام Ubuntu. للتحقق من الإصدار المثبت، استخدم الأمر التالي في سطر الأوامر:


python3 --version


إذا كان Python 3 غير مثبت، يمكنك تثبيته باستخدام الأمر التالي:


sudo apt install python3


بعد التأكد من تثبيت Python، سنحتاج إلى تثبيت pip، وهو مدير الحزم الخاص بـ Python، عبر هذا الأمر:

sudo apt install python3-pip


ثم، نقوم بإنشاء بيئة افتراضية للمشروع:


python3 -m venv myprojectenv

source myprojectenv/bin/activate


الخطوة 2 : تثبيت Flask وقاعدة البيانات SQLite

نقوم بتثبيت Flask و Flask-SQLAlchemy عبر pip:


pip install Flask flask_sqlalchemy


الخطوة 3: إعداد تطبيق Flask مع قاعدة البيانات

الآن، سنبدأ في إعداد التطبيق الذي يستخدم قاعدة بيانات SQLite.

إعداد ملف app.py:


from flask import Flask, jsonify, request

from flask_sqlalchemy import SQLAlchemy


# إعداد التطبيق

app = Flask(__name__)


# إعداد الاتصال بقاعدة البيانات SQLite

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///items.db'  # مسار قاعدة البيانات

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # إيقاف تتبع التعديلات


# تهيئة قاعدة البيانات

db = SQLAlchemy(app)


# تعريف نموذج البيانات (Model) الذي يمثل جدول في قاعدة البيانات

class Item(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(100), nullable=False)


    def __repr__(self):

        return f'<Item {self.name}>'


# إنشاء قاعدة البيانات والجداول

with app.app_context():

    db.create_all()


# نقطة النهاية الرئيسية

@app.route('/')

def hello_world():

    return jsonify(message="Hello, World!")


# GET: استرجاع جميع العناصر

@app.route('/api/items', methods=['GET'])

def get_items():

    items = Item.query.all()  # استرجاع جميع العناصر من قاعدة البيانات

    return jsonify([{"id": item.id, "name": item.name} for item in items])


# GET: استرجاع عنصر محدد

@app.route('/api/items/<int:item_id>', methods=['GET'])

def get_item(item_id):

    item = Item.query.get(item_id)  # استرجاع عنصر حسب ID

    if not item:

        return jsonify({"error": "Item not found"}), 404

    return jsonify({"id": item.id, "name": item.name})


# POST: إضافة عنصر جديد

@app.route('/api/items', methods=['POST'])

def create_item():

    data = request.get_json()  # الحصول على البيانات من الطلب

    new_item = Item(name=data['name'])  # إنشاء عنصر جديد

    db.session.add(new_item)  # إضافة العنصر إلى الجلسة

    db.session.commit()  # حفظ التعديلات في قاعدة البيانات

    return jsonify({"id": new_item.id, "name": new_item.name}), 201


# PUT: تحديث عنصر

@app.route('/api/items/<int:item_id>', methods=['PUT'])

def update_item(item_id):

    item = Item.query.get(item_id)

    if not item:

        return jsonify({"error": "Item not found"}), 404

    data = request.get_json()

    item.name = data.get('name', item.name)

    db.session.commit()

    return jsonify({"id": item.id, "name": item.name})


# DELETE: حذف عنصر

@app.route('/api/items/<int:item_id>', methods=['DELETE'])

def delete_item(item_id):

    item = Item.query.get(item_id)

    if not item:

        return jsonify({"error": "Item not found"}), 404

    db.session.delete(item)

    db.session.commit()

    return '', 204


if __name__ == "__main__":

    app.run(debug=True)

```


شرح كود التطبيق


  • استخدمنا SQLAlchemy لربط التطبيق بقاعدة بيانات SQLite. تم تعريف نموذج Item الذي يمثل جدولًا في قاعدة البيانات يحتوي على id و name.
  • عمليات CRUD:

  1. GET: استرجاع جميع العناصر أو عنصر معين من قاعدة البيانات.
  2. POST: إضافة عنصر جديد إلى قاعدة البيانات.
  3. PUT: تحديث عنصر موجود.
  4. DELETE: حذف عنصر من قاعدة البيانات.

  • استخدامنا db.session.add لإضافة العناصر وdb.session.commit لتثبيت التعديلات في قاعدة البيانات.


الخطوة 4:  تشغيل واختبار الواجهة البرمجية API

لتشغيل التطبيق، استخدم الأمر التالي:


python3 app.py

ستلاحظ أن السيرفر يعمل على http://127.0.0.1:5000.

يمكن الآن اختبار نقاط الوصول باستخدام curl كما يلي:

  • لاسترجاع جميع العناصر من قاعدة البيانات نكتب:

  curl http://127.0.0.1:5000/api/items

لإضافة عنصر جديد نكتب:

  curl -X POST -H "Content-Type: application/json" -d '{"name": "Item 3"}' http://127.0.0.1:5000/api/items

لتحديث عنصر:

  curl -X PUT -H "Content-Type: application/json" -d '{"name": "Updated Item 1"}' http://127.0.0.1:5000/api/items/1

لحذف عنصر نكتب:

  curl -X DELETE http://127.0.0.1:5000/api/items/1


الخاتمة

تعلمنا في هذا المقال، كيفية إنشاء واجهة برمجة تطبيقات REST باستخدام Flask مع دمج SQLite لتخزين البيانات بشكل دائم. يمكنك الآن توسيع هذا التطبيق عن طريق إضافة ميزات إضافية مثل التوثيق Authentication أو استخدام قاعدة بيانات أكبر مثل PostgreSQL.


Previous Post
No Comment
Add Comment
comment url