أنشئ تطبيقًا باستخدام FastAPI لـ Python
نشرت: 2022-11-29FastAPI هو إطار عمل ويب سريع وخفيف الوزن لبناء واجهات برمجة تطبيقات حديثة باستخدام 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 ، ستحتاج إلى القيام ببعض الأشياء أولاً.
تأكد من أن لديك محرر نصوص / 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
ستختبر تثبيت 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 الخاص بك ، كما هو موضح في السطر السادس من المقتطف أعلاه.
استخدام تلميحات الكتابة
إذا كنت تستخدم 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
وسترى شاشة بها جميع نقاط النهاية والأساليب والمخططات.
يتم توفير وثائق واجهة برمجة التطبيقات التلقائية المستندة إلى المستعرض بواسطة FastAPI ، ولا تحتاج إلى فعل أي شيء آخر للاستفادة منها.
من وثائق API البديلة المستندة إلى المستعرض ، والتي توفرها FastAPI أيضًا ، Redoc. للوصول إلى Redoc ، انتقل إلى http://localhost:8000/redoc
، حيث سيتم تقديمك بقائمة بنقاط النهاية والأساليب والاستجابات الخاصة بها.
إعداد المسارات في FastAPI
يتيح لك مصمم @app
تحديد طريقة المسار ، مثل @app.get
أو @app.post
، ويدعم GET
و POST
و PUT
و DELETE
، بالإضافة إلى الخيارات الأقل شيوعًا ، HEAD
و PATCH
و TRACE
.
بناء التطبيق الخاص بك مع FastAPI
في هذا البرنامج التعليمي ، سيتم إرشادك خلال إنشاء تطبيق CRUD باستخدام FastAPI. سيكون التطبيق قادرًا على:
- قم بإنشاء مستخدم
- اقرأ سجل قاعدة بيانات المستخدم
- تحديث مستخدم موجود
- حذف مستخدم معين
لتنفيذ عمليات CRUD هذه ، ستقوم بإنشاء طرق تعرض نقاط نهاية API. ستكون النتيجة قاعدة بيانات في الذاكرة يمكنها تخزين قائمة بالمستخدمين.
ستستخدم مكتبة 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
مباشرةً:
# 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
. يجب أن يعرض هذا قائمة بجميع المستخدمين لديك ، كما هو موضح أدناه:
في هذه المرحلة ، سيبدو ملف 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.
حذف سجلات قاعدة البيانات
نظرًا لأنك تقوم بإنشاء تطبيق 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.
تحديث سجلات قاعدة البيانات
ستقوم بإنشاء نقطة نهاية لتحديث تفاصيل المستخدم. تتضمن التفاصيل التي يمكن تحديثها المعلمات التالية: 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
يوجد أدناه لقطة شاشة للاختبار.
ملخص
في هذا البرنامج التعليمي ، تعرفت على إطار عمل FastAPI الخاص ببايثون ورأيت بنفسك مدى السرعة التي يمكنك بها الحصول على تطبيق مدعوم من FastAPI وتشغيله. لقد تعلمت كيفية إنشاء نقاط نهاية واجهة برمجة تطبيقات CRUD باستخدام إطار العمل - إنشاء سجلات قاعدة البيانات وقراءتها وتحديثها وحذفها.
الآن ، إذا كنت ترغب في نقل تطوير تطبيق الويب الخاص بك إلى المستوى التالي ، فتأكد من مراجعة منصة Kinsta لاستضافة التطبيقات واستضافة قواعد البيانات. مثل FastAPI ، إنه بسيط للغاية.