أنشئ تطبيقًا باستخدام FastAPI لـ Python

نشرت: 2022-11-29

FastAPI هو إطار عمل ويب سريع وخفيف الوزن لبناء واجهات برمجة تطبيقات حديثة باستخدام Python 3.6 وما فوق. في هذا البرنامج التعليمي ، سنتعرف على أساسيات إنشاء تطبيق باستخدام FastAPI ، وستتعرف على سبب ترشيحه كأحد أفضل أطر العمل مفتوحة المصدر لعام 2021.

بمجرد أن تصبح جاهزًا لتطوير تطبيقات FastAPI الخاصة بك ، لن تضطر إلى البحث بعيدًا للعثور على مكان لاستضافتها. توفر خدمات استضافة التطبيقات وقواعد البيانات الخاصة بـ Kinsta منصة كخدمة قوية على Python.

دعنا نتعلم الأساسيات أولاً.


مزايا FastAPI

فيما يلي بعض المزايا التي يجلبها إطار عمل FastAPI إلى المشروع.

  • السرعة: كما يوحي الاسم ، FastAPI هو إطار عمل سريع جدًا. سرعته قابلة للمقارنة مع Go و Node.js ، والتي تعتبر بشكل عام من بين أسرع الخيارات لبناء واجهات برمجة التطبيقات.
  • سهل التعلم والكود: لقد اكتشف FastAPI بالفعل كل ما تحتاجه تقريبًا لإنشاء واجهة برمجة تطبيقات جاهزة للإنتاج. بصفتك مطورًا يستخدم FastAPI ، لا تحتاج إلى ترميز كل شيء من البداية. باستخدام بضعة أسطر فقط من التعليمات البرمجية ، يمكنك الحصول على واجهة برمجة تطبيقات RESTful جاهزة للنشر.
  • التوثيق الشامل: يستخدم FastAPI معايير توثيق OpenAPI ، لذلك يمكن إنشاء الوثائق بشكل ديناميكي. توفر هذه الوثائق معلومات مفصلة حول نقاط نهاية FastAPI والاستجابات والمعلمات وأكواد الإرجاع.
  • واجهات برمجة التطبيقات مع عدد أقل من الأخطاء: يدعم FastAPI التحقق من صحة البيانات المخصصة ، مما يسمح للمطورين بإنشاء واجهات برمجة التطبيقات مع عدد أقل من الأخطاء. يتباهى مطورو FastAPI بأن إطار العمل ينتج عنه عدد أقل من الأخطاء التي يسببها الإنسان - بنسبة 40٪ أقل.
  • تلميحات النوع: تم تقديم وحدة الأنواع في Python 3.5. يتيح لك هذا التصريح عن type المتغير. عندما يتم الإعلان عن نوع المتغير ، تكون IDEs قادرة على تقديم دعم أفضل والتنبؤ بالأخطاء بشكل أكثر دقة.
هل تفكر في FastAPI لمشروعك القادم؟ تحقق من مزاياها في هذا الدليل: انقر للتغريد

كيف تبدأ مع FastAPI

لمتابعة هذا البرنامج التعليمي والبدء في FastAPI ، ستحتاج إلى القيام ببعض الأشياء أولاً.

تأكد من أن لديك محرر نصوص / IDE للمبرمج ، مثل Visual Studio Code. تشمل الخيارات الأخرى Sublime Text و Espresso.

من الشائع تشغيل تطبيقات Python ومثيلاتها في بيئات افتراضية. تسمح البيئات الافتراضية لمجموعات الحزم والتكوينات المختلفة بالعمل في وقت واحد ، وتجنب التعارضات بسبب إصدارات الحزم غير المتوافقة.

لإنشاء بيئة افتراضية ، افتح Terminal وقم بتشغيل هذا الأمر:

 $ python3 -m venv env

ستحتاج أيضًا إلى تنشيط البيئة الافتراضية. سيختلف الأمر للقيام بذلك اعتمادًا على نظام التشغيل و shell الذي تستخدمه. فيما يلي بعض أمثلة تنشيط CLI لعدد من البيئات:

 # On Unix or MacOS (bash shell): /path/to/venv/bin/activate # On Unix or MacOS (csh shell): /path/to/venv/bin/activate.csh # On Unix or MacOS (fish shell): /path/to/venv/bin/activate.fish # On Windows (command prompt): \path\to\venv\Scripts\activate.bat # On Windows (PowerShell): \path\to\venv\Scripts\Activate.ps1

(يمكن أيضًا تكوين بعض IDEs المدرك لبيثون لتنشيط البيئة الافتراضية الحالية.)

الآن ، قم بتثبيت FastAPI:

 $ pip3 install fastapi

FastAPI هو إطار عمل لبناء واجهات برمجة التطبيقات ، ولكن لاختبار واجهات برمجة التطبيقات الخاصة بك ، ستحتاج إلى خادم ويب محلي. Uvicorn هو خادم ويب غير متزامن لبوابة الخادم (ASGI) سريع البرق لبيثون وهو رائع للتطوير. لتثبيت Uvicorn ، قم بتشغيل هذا الأمر:

 $ pip3 install "uvicorn[standard]"

عند التثبيت الناجح ، قم بإنشاء ملف باسم main.py داخل دليل عمل مشروعك. سيكون هذا الملف نقطة دخول التطبيق الخاص بك.

تخطيط مشروع FastAPI داخل IDE.
عرض مشروع FastAPI الأساسي داخل IDE.

مثال سريع FastAPI

ستختبر تثبيت FastAPI عن طريق إعداد نموذج نقطة نهاية بسرعة. في ملف main.py ، الصق الكود التالي ، ثم احفظ الملف:

 # main.py from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"greeting":"Hello world"}

المقتطف أعلاه ينشئ نقطة نهاية FastAPI أساسية. فيما يلي ملخص لما يفعله كل سطر:

  • from fastapi import FastAPI : يتم توفير وظيفة API الخاصة بك بواسطة فئة FastAPI Python.
  • app = FastAPI() : يؤدي هذا إلى إنشاء مثيل FastAPI.
  • @app.get("/") : هذا هو مصمم بيثون يحدد لـ FastAPI أن الوظيفة الموجودة أدناه مسؤولة عن معالجة الطلب.
  • @app.get("/") : هذا هو المصمم الذي يحدد المسار. يؤدي هذا إلى إنشاء طريقة GET على مسار الموقع. ثم يتم إرجاع النتيجة من خلال وظيفة الالتفاف.
  • تتضمن العمليات المحتملة الأخرى المستخدمة للتواصل @app.post() و @app.put() و @app.delete() و @app.options() و @app.head() و @app.patch() و @app.trace() .

في دليل files ، قم بتشغيل الأمر التالي في Terminal لبدء خادم API:

 $ uvicorn main:app --reload

في هذا الأمر ، main هو اسم الوحدة الخاصة بك. كائن app هو مثيل لتطبيقك ، ويتم استيراده إلى خادم ASGI. تخبر علامة --reload الخادم بإعادة التحميل تلقائيًا عند إجراء أي تغييرات.

يجب أن ترى شيئًا كهذا في جهازك:

 $ uvicorn main:app --reload INFO: Will watch for changes in these directories: ['D:\\WEB DEV\\Eunit\\Tests\\fast-api'] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [26888] using WatchFiles INFO: Started server process [14956] INFO: Waiting for application startup. INFO: Application startup complete.

في المستعرض الخاص بك ، انتقل إلى http://localhost:8000 لتأكيد عمل API الخاص بك. يجب أن ترى "Hello": "World" ككائن JSON على الصفحة. يوضح هذا مدى سهولة إنشاء API باستخدام FastAPI. كل ما عليك فعله هو تحديد مسار وإرجاع قاموس Python الخاص بك ، كما هو موضح في السطر السادس من المقتطف أعلاه.

تطبيق FastAPI Hello World يعمل في مستعرض ويب.
تطبيق FastAPI Hello World في مستعرض ويب.

استخدام تلميحات الكتابة

إذا كنت تستخدم Python ، فأنت معتاد على التعليق على المتغيرات بأنواع البيانات الأساسية مثل int و str و float و bool . ومع ذلك ، من الإصدار 3.9 من Python ، تم تقديم هياكل بيانات متقدمة. يتيح لك هذا العمل مع هياكل البيانات مثل dictionaries lists tuples باستخدام تلميحات الكتابة الخاصة بـ FastAPI ، يمكنك هيكلة مخطط بياناتك باستخدام نماذج pydantic ثم استخدام نماذج pydantic لكتابة تلميح والاستفادة من التحقق من صحة البيانات المتوفرة.

في المثال أدناه ، يتم توضيح استخدام تلميحات الكتابة في Python باستخدام حاسبة بسيطة لسعر الوجبة ، calculate_meal_fee :

 def calculate_meal_fee(beef_price: int, meal_price: int) -> int: total_price: int = beef_price + meal_price return total_price print("Calculated meal fee", calculate_meal_fee(75, 19))

لاحظ أن تلميحات الكتابة لا تغير كيفية تشغيل التعليمات البرمجية الخاصة بك.

وثائق FastAPI التفاعلية API

يستخدم FastAPI Swagger UI لتوفير وثائق API تفاعلية تلقائية. للوصول إليه ، انتقل إلى http://localhost:8000/docs وسترى شاشة بها جميع نقاط النهاية والأساليب والمخططات.

لقطة شاشة لواجهة Swagger UI للتوثيق.
وثائق Swagger UI لـ FastAPI.

يتم توفير وثائق واجهة برمجة التطبيقات التلقائية المستندة إلى المستعرض بواسطة FastAPI ، ولا تحتاج إلى فعل أي شيء آخر للاستفادة منها.

من وثائق API البديلة المستندة إلى المستعرض ، والتي توفرها FastAPI أيضًا ، Redoc. للوصول إلى Redoc ، انتقل إلى http://localhost:8000/redoc ، حيث سيتم تقديمك بقائمة بنقاط النهاية والأساليب والاستجابات الخاصة بها.

لقطة شاشة لواجهة Redoc للتوثيق.
وثائق Redoc لـ FastAPI.

إعداد المسارات في FastAPI

يتيح لك مصمم @app تحديد طريقة المسار ، مثل @app.get أو @app.post ، ويدعم GET و POST و PUT و DELETE ، بالإضافة إلى الخيارات الأقل شيوعًا ، HEAD و PATCH و TRACE .

بناء التطبيق الخاص بك مع FastAPI

في هذا البرنامج التعليمي ، سيتم إرشادك خلال إنشاء تطبيق CRUD باستخدام FastAPI. سيكون التطبيق قادرًا على:

  • قم بإنشاء مستخدم
  • اقرأ سجل قاعدة بيانات المستخدم
  • تحديث مستخدم موجود
  • حذف مستخدم معين

لتنفيذ عمليات CRUD هذه ، ستقوم بإنشاء طرق تعرض نقاط نهاية API. ستكون النتيجة قاعدة بيانات في الذاكرة يمكنها تخزين قائمة بالمستخدمين.

رسم تخطيطي لهيكل جدول قاعدة البيانات لأمثلة CRUD.
بنية جدول قاعدة البيانات لأمثلة CRUD.

ستستخدم مكتبة pydantic لإجراء التحقق من صحة البيانات وإدارة الإعدادات باستخدام التعليقات التوضيحية من نوع Python. لأغراض هذا البرنامج التعليمي ، ستعلن عن شكل بياناتك كفئات ذات سمات.

سيستخدم هذا البرنامج التعليمي قاعدة البيانات الموجودة في الذاكرة. هذا للبدء بسرعة في استخدام FastAPI لبناء واجهات برمجة التطبيقات الخاصة بك. ومع ذلك ، بالنسبة للإنتاج ، يمكنك الاستفادة من أي قاعدة بيانات من اختيارك ، مثل PostgreSQL أو MySQL أو SQLite أو حتى Oracle.

بناء التطبيق

ستبدأ بإنشاء نموذج المستخدم الخاص بك. سيكون لنموذج المستخدم السمات التالية:

  • id : معرّف فريد عالمي (UUID)
  • first_name : الاسم الأول للمستخدم
  • last_name : الاسم الأخير للمستخدم
  • gender : جنس المستخدم
  • roles ، وهي قائمة تحتوي على أدوار admin user

ابدأ بإنشاء ملف جديد باسم Models.py في دليل العمل الخاص بك ، ثم الصق الكود التالي في Models.py لإنشاء النموذج الخاص بك:

 # models.py from typing import List, Optional from uuid import UUID, uuid4 from pydantic import BaseModel from enum import Enum from pydantic import BaseModel class Gender(str, Enum): male = "male" female = "female" class Role(str, Enum): admin = "admin" user = "user" class User(BaseModel): id: Optional[UUID] = uuid4() first_name: str last_name: str gender: Gender roles: List[Role]

في الكود أعلاه:

  • تمتد فئة User الخاصة بك إلى BaseModel ، والذي يتم استيراده بعد ذلك من pydantic .
  • لقد حددت سمات المستخدم ، كما تمت مناقشته أعلاه.

الخطوة التالية هي إنشاء قاعدة البيانات الخاصة بك. استبدل محتويات ملف main.py بالرمز التالي:

 # main.py from typing import List from uuid import uuid4 from fastapi import FastAPI from models import Gender, Role, User app = FastAPI() db: List[User] = [ User( id=uuid4(), first_name="John", last_name="Doe", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Jane", last_name="Doe", gender=Gender.female, roles=[Role.user], ), User( id=uuid4(), first_name="James", last_name="Gabriel", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Eunit", last_name="Eunit", gender=Gender.male, roles=[Role.admin, Role.user], ), ]

في main.py :

  • قمت بتهيئة db بنوع من List ، وتمرير نموذج User
  • لقد أنشأت قاعدة بيانات في الذاكرة بأربعة مستخدمين ، ولكل منهم السمات المطلوبة مثل first_name الأول واسم last_name gender roles . يتم تعيين أدوار admin user Eunit ، بينما يتم تعيين دور user فقط للمستخدمين الثلاثة الآخرين.

قراءة سجلات قاعدة البيانات

لقد نجحت في إعداد قاعدة البيانات في الذاكرة الخاصة بك وملؤها بالمستخدمين ، لذا فإن الخطوة التالية هي إعداد نقطة نهاية ستعيد قائمة بجميع المستخدمين. هذا هو المكان الذي يأتي فيه FastAPI.

في ملف main.py ، الصق الكود التالي أسفل نقطة نهاية Hello World مباشرةً:

هل تعاني من مشاكل التوقف و WordPress؟ Kinsta هو حل الاستضافة المصمم لتوفير الوقت! تحقق من ميزاتنا
 # main.py @app.get("/api/v1/users") async def get_users(): return db

يحدد هذا الرمز نقطة النهاية /api/v1/users ، وينشئ وظيفة غير متزامنة ، get_users ، والتي تُرجع جميع محتويات قاعدة البيانات ، db .

احفظ ملفك ، ويمكنك اختبار نقطة نهاية المستخدم الخاصة بك. قم بتشغيل الأمر التالي في جهازك لبدء خادم API:

 $ uvicorn main:app --reload

في المستعرض الخاص بك ، انتقل إلى http://localhost:8000/api/v1/users . يجب أن يعرض هذا قائمة بجميع المستخدمين لديك ، كما هو موضح أدناه:

لقطة شاشة لبيانات المستخدم التي تم إرجاعها بواسطة طلب FastAPI GET.
تم استرداد بيانات المستخدم بواسطة طلب قراءة قاعدة بيانات FastAPI.

في هذه المرحلة ، سيبدو ملف main.py على النحو التالي:

 # main.py from typing import List from uuid import uuid4 from fastapi import FastAPI from models import Gender, Role, User app = FastAPI() db: List[User] = [ User( id=uuid4(), first_name="John", last_name="Doe", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Jane", last_name="Doe", gender=Gender.female, roles=[Role.user], ), User( id=uuid4(), first_name="James", last_name="Gabriel", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Eunit", last_name="Eunit", gender=Gender.male, roles=[Role.admin, Role.user], ), ] @app.get("/") async def root(): return {"Hello": "World",} @app.get("/api/v1/users") async def get_users(): return db

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

الخطوة التالية هي إنشاء نقطة نهاية لإنشاء مستخدم جديد في قاعدة البيانات الخاصة بك. الصق المقتطف التالي في ملف main.py :

 # main.py @app.post("/api/v1/users") async def create_user(user: User): db.append(user) return {"id": user.id}

في هذا المقتطف ، حددت نقطة النهاية لإرسال مستخدم جديد @app.post decorator لإنشاء طريقة POST .

قمت أيضًا بإنشاء الوظيفة create_user ، والتي تقبل user نموذج User ، وألحقت (أضافت) user الذي تم إنشاؤه حديثًا إلى قاعدة البيانات ، db . أخيرًا ، تقوم نقطة النهاية بإرجاع كائن JSON id المستخدم الذي تم إنشاؤه حديثًا.

سيتعين عليك استخدام وثائق API التلقائية التي يوفرها FastAPI لاختبار نقطة النهاية الخاصة بك ، كما هو موضح أعلاه. هذا لأنه لا يمكنك تقديم طلب نشر باستخدام متصفح الويب. انتقل إلى http://localhost:8000/docs للاختبار باستخدام الوثائق المقدمة من SwaggerUI.

لقطة شاشة تعرض معلمات طلب FastAPI POST.
معلمات طلب FastAPI POST.

حذف سجلات قاعدة البيانات

نظرًا لأنك تقوم بإنشاء تطبيق CRUD ، سيحتاج التطبيق الخاص بك إلى القدرة على حذف مورد محدد. في هذا البرنامج التعليمي ، ستقوم بإنشاء نقطة نهاية لحذف مستخدم.

الصق الكود التالي في ملف main.py :

 # main.py from uuid import UUID from fastapi HTTPException @app.delete("/api/v1/users/{id}") async def delete_user(id: UUID): for user in db: if user.id == id: db.remove(user) return raise HTTPException( status_code=404, detail=f"Delete user failed, id {id} not found." )

فيما يلي تفصيل تفصيلي لكيفية عمل هذا الرمز:

  • @app.delete("/api/v1/users/{id}") : لقد أنشأت نقطة نهاية الحذف باستخدام @app.delete() decorator. لا يزال المسار /api/v1/users/{id} ، ولكنه بعد ذلك يسترد id ، وهو متغير مسار يتوافق مع معرف المستخدم.
  • async def delete_user(id: UUID): لإنشاء وظيفة delete_user ، والتي تسترد id من عنوان URL.
  • for user in db: هذا يخبر التطبيق بالمرور عبر المستخدمين في قاعدة البيانات ، والتحقق مما إذا كان id الذي تم تمريره يتطابق مع مستخدم في قاعدة البيانات.
  • db.remove(user) : إذا تطابق id مع مستخدم ، فسيتم حذف المستخدم ؛ خلاف ذلك ، سيتم HTTPException برمز الحالة 404.
لقطة شاشة تعرض معلمات طلب FastAPI DELETE.
معلمات طلب FastAPI DELETE.

تحديث سجلات قاعدة البيانات

ستقوم بإنشاء نقطة نهاية لتحديث تفاصيل المستخدم. تتضمن التفاصيل التي يمكن تحديثها المعلمات التالية: last_name first_name roles .

في ملف Models.py الخاص بك ، الصق الكود التالي أسفل نموذج User الخاص بك ، أي بعد فئة User(BaseModel): :

 # models.py class UpdateUser(BaseModel): first_name: Optional[str] last_name: Optional[str] roles: Optional[List[Role]]

في هذا المقتطف ، تقوم الفئة UpdateUser بتوسيع BaseModel . يمكنك بعد ذلك تعيين معلمات المستخدم القابلة للتحديث ، مثل last_name first_name roles لتكون اختيارية.

ستقوم الآن بإنشاء نقطة نهاية لتحديث تفاصيل مستخدم معين. في ملف main.py ، الصق الكود التالي بعد @app.delete decorator:

 # main.py @app.put("/api/v1/users/{id}") async def update_user(user_update: UpdateUser, id: UUID): for user in db: if user.id == id: if user_update.first_name is not None: user.first_name = user_update.first_name if user_update.last_name is not None: user.last_name = user_update.last_name if user_update.roles is not None: user.roles = user_update.roles return user.id raise HTTPException(status_code=404, detail=f"Could not find user with id: {id}")

في الكود أعلاه ، قمت بما يلي:

  • Created @app.put("/api/v1/users/{id}") ، نقطة نهاية التحديث. يحتوي على id معلمة متغير يتوافق مع معرف المستخدم.
  • أنشأ طريقة تسمى update_user ، والتي تأخذ في فئة UpdateUser id .
  • استخدم حلقة for للتحقق مما إذا كان المستخدم المرتبط id الذي تم تمريره موجودًا في قاعدة البيانات.
  • تم التحقق مما إذا كانت أي من معلمات المستخدم is not None بلا (ليست فارغة). إذا لم تكن أي معلمة ، مثل first_name أو last_name أو roles خالية ، فسيتم تحديثها.
  • في حالة نجاح العملية ، يتم إرجاع معرف المستخدم.
  • إذا لم يكن المستخدم موجودًا ، فسيظهر استثناء HTTPException برمز الحالة 404 ورسالة Could not find user with id: {id} يظهر.

لاختبار نقطة النهاية هذه ، تأكد من تشغيل خادم Uvicorn الخاص بك. إذا لم يكن قيد التشغيل ، أدخل هذا الأمر:

 uvicorn main:app --reload

يوجد أدناه لقطة شاشة للاختبار.

لقطة شاشة تعرض معلمات طلب UPDATE.
معلمات طلب FastAPI UPDATE.

تعرف على كيفية قيام FastAPI بإسقاط الأخطاء التي يسببها الإنسان بنسبة تصل إلى 40 بالمائة. ابدأ هنا: انقر للتغريد

ملخص

في هذا البرنامج التعليمي ، تعرفت على إطار عمل FastAPI الخاص ببايثون ورأيت بنفسك مدى السرعة التي يمكنك بها الحصول على تطبيق مدعوم من FastAPI وتشغيله. لقد تعلمت كيفية إنشاء نقاط نهاية واجهة برمجة تطبيقات CRUD باستخدام إطار العمل - إنشاء سجلات قاعدة البيانات وقراءتها وتحديثها وحذفها.

الآن ، إذا كنت ترغب في نقل تطوير تطبيق الويب الخاص بك إلى المستوى التالي ، فتأكد من مراجعة منصة Kinsta لاستضافة التطبيقات واستضافة قواعد البيانات. مثل FastAPI ، إنه بسيط للغاية.