لماذا يجب أن تجرب FastAPI؟

صورة الشعار مأخوذ من مستودع Github FastAPI


FastAPI هو إطار ويب جديد نسبيًا مكتوب بلغة برمجة Python لإنشاء واجهة برمجة تطبيقات REST (وإذا جربت بجد ، ثم GraphQL) بناءً على ميزات Python 3.6+ الجديدة ، مثل: تلميحات الكتابة ، عدم التزامن الأصلي (asyncio) ). من بين أشياء أخرى ، يتكامل FastAPI بإحكام مع مخطط OpenAPI ويقوم تلقائيًا بإنشاء وثائق واجهة برمجة التطبيقات من خلال Swagger و ReDoc


ويستند FastAPI على Starlette و Pydantic .
Starlette هو إطار ASGI الصغير لكتابة تطبيقات الويب.
Pydantic - مكتبة لتحليل والتحقق من صحة البيانات بناءً على تلميحات بايثون.


ماذا يقولون عن FastAPI؟


"[...] أستخدم FastAPI غالبًا في الأيام الأخيرة. [...] بالتأكيد أخطط لاستخدامه في جميع خدمات ML لفريقي في Microsoft. بعضها يندمج في Windows وبعض منتجات Office."

كبير خان - مايكروسوفت ( المرجع )


"إذا كنت تريد معرفة إطار عمل آخر لكتابة واجهة برمجة تطبيقات REST ، فقم بإلقاء نظرة على FastAPI [...] إنه سريع وسهل الاستخدام والتعلم. [...]"

"الآن نستخدم FastAPI لواجهات برمجة التطبيقات لدينا [...] أعتقد أنك ستحبه! [...]"

إيناس مونتاني - ماثيو هونيبال - مؤسسو انفجار منظمة العفو الدولية - منشئو سبأ ( المرجع ) - ( المرجع )


تم إنشاء API الحد الأدنى باستخدام FastAPI


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


تثبيت المتطلبات الأساسية


pip install wheel -U pip install uvicorn fastapi pydantic 

وحدة جديدة!
Uvicorn هو خادم ويب متوافق مع ASGI سنستخدمه لتشغيل تطبيقنا.


أولاً ، سننشئ أساس طلبنا.


 from fastapi import FastAPI app = FastAPI(title="Random phrase") 

هذا التطبيق قيد التشغيل بالفعل ويمكن تشغيله.
اكتب هذا الأمر في الجهاز الخاص بك وافتح الصفحة في المستعرض على العنوان http://127.0.0.1:8000/docs .


 uvicorn <__>:app 

لكن بينما في تطبيقنا ، لم تتم الإشارة إلى نقطة نهاية واحدة - دعنا نصلحها!


قاعدة بيانات


بما أننا نكتب مولد جملة عشوائي ، فمن الواضح أننا بحاجة إلى تخزينها في مكان ما. لهذا ، اخترت python-dict بسيط.


قم db.py ملف db.py وابدأ كتابة التعليمات البرمجية.


نحن نستورد الوحدات اللازمة:


 import typing import random from pydantic import BaseModel from pydantic import Field 

بعد - نقوم بتعيين نموذجين: عبارة الإدخال (تلك التي سيرسلها المستخدم إلينا) و "المخرجات" (تلك التي سنرسلها إلى المستخدم).


 class PhraseInput(BaseModel): """Phrase model""" author: str = "Anonymous" #  .    -   . text: str = Field(..., title="Text", description="Text of phrase", max_length=200) #  .   - 200 . class PhraseOutput(PhraseInput): id: typing.Optional[int] = None # ID     . 

بعد ذلك ، قم بإنشاء فصل بسيط للعمل مع قاعدة البيانات:


 class Database: """ Our **fake** database. """ def __init__(self): self._items: typing.Dict[int, PhraseOutput] = {} # id: model def get_random(self) -> int: #    return random.choice(self._items.keys()) def get(self, id: int) -> typing.Optional[PhraseOutput]: #    ID return self._items.get(id) def add(self, phrase: PhraseInput) -> PhraseOutput: #   id = len(self._items) + 1 phrase_out = PhraseOutput(id=id, **phrase.dict()) self._items[phrase_out.id] = phrase_out return phrase_out def delete(self, id: int) -> typing.Union[typing.NoReturn, None]: #   if id in self._items: del self._items[id] else: raise ValueError("Phrase doesn't exist") 

الآن يمكنك البدء في كتابة API نفسها.


API


قم main.py ملف main.py واستيراد الوحدات التالية:


 from fastapi import FastAPI from fastapi import HTTPException from db import PhraseInput from db import PhraseOutput from db import Database 

نهيئ تطبيقنا وقاعدة البيانات:


 app = FastAPI(title="Random phrase") db = Database() 

واكتب طريقة بسيطة للحصول على عبارة عشوائية!


 @app.get( "/get", response_description="Random phrase", description="Get random phrase from database", response_model=PhraseOutput, ) async def get(): try: phrase = db.get(db.get_random()) except IndexError: raise HTTPException(404, "Phrase list is empty") return phrase 

كما ترون ، في الديكور ، أشير أيضًا إلى بعض القيم الأخرى اللازمة لإنشاء وثائق أكثر جمالا :) في الوثائق الرسمية ، يمكنك الاطلاع على جميع المعلمات الممكنة.


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


وبالمثل ، نكتب طرقًا أخرى:


 @app.post( "/add", response_description="Added phrase with *id* parameter", response_model=PhraseOutput, ) async def add(phrase: PhraseInput): phrase_out = db.add(phrase) return phrase_out @app.delete("/delete", response_description="Result of deleting") async def delete(id: int): try: db.delete(id) except ValueError as e: raise HTTPException(404, str(e)) 

وهذا كل شيء! يتم تنفيذ API الصغيرة ولكن مفيدة لدينا!


الآن يمكننا تشغيل التطبيق باستخدام uvicorn ، وفتح الوثائق عبر الإنترنت ( http://127.0.0.1/docs ) وتجربة API لدينا!



مواد مفيدة


بالطبع ، لم أستطع إخبارك بجميع ميزات FastAPI ، على سبيل المثال ، مثل: نظام DI الذكي ، والوسطاء ، وملفات تعريف الارتباط ، وطرق المصادقة القياسية في واجهة برمجة التطبيقات (jwt ، oauth2 ، api-key) وغير ذلك الكثير!


لكن الغرض من هذه المقالة ليس نظرة عامة على جميع ميزات هذا الإطار ، ولكن كم يدفعك لاستكشافه بنفسك. FastAPI لديه وثائق كبيرة مع الكثير من الأمثلة.


كود من مقال عن جيثب
الوثائق الرسمية
مستودع جيثب


PS


قام cryo8822 بترجمة المقال إلى اللغة الإنجليزية ، شكرًا! .

Source: https://habr.com/ru/post/ar478620/


All Articles