أول API بـ FastAPI
الـ API هو الشباك اللي التطبيقات التانية بتكلم منه الموديل بتاعك.
يعني إيه API؟
زي الجرسون في مطعم: الزبون (تطبيق موبايل أو موقع) مبيدخلش المطبخ. بيدي الطلب للجرسون بشكل معين، والجرسون يرجعله الأكل. الـ API بيستقبل طلبات على لينكات معينة (endpoints)، وينفذ، ويرجع النتيجة غالباً بصيغة JSON.
FastAPI أشهر مكتبة بايثون لده دلوقتي: سريعة، وسهلة، وبتعمل صفحة توثيق تفاعلية لوحدها. وفاكر الـ decorators من المرحلة ٢؟ هنا هتشوفها في كل حتة.
pip install "fastapi[standard]"from fastapi import FastAPI app = FastAPI(title="My first API") @app.get("/") # GET request to the root URL def home(): return {"message": "Ahlan! The API is running"} @app.get("/square/{number}") # path parameter def square(number: int): # type hint -> automatic validation return {"number": number, "square": number ** 2} @app.get("/greet") def greet(name: str, lang: str = "ar"): # query parameters (?name=...&lang=...) text = f"أهلاً يا {name}" if lang == "ar" else f"Hello {name}" return {"greeting": text}
شغّله وجرّبه
fastapi dev hello_api.py # Now open in your browser: # http://127.0.0.1:8000/square/12 # http://127.0.0.1:8000/docs <- interactive docs, try every endpoint!
صفحة /docs هتبهرك: FastAPI عمل توثيق كامل لكل endpoint من الـ type hints، وتقدر تجرب كل واحد من المتصفح. ولو عايز تختبر من الكود، في أداة اسمها TestClient بتبعت طلبات للـ API من غير ما تشغل سيرفر:
from fastapi.testclient import TestClient from hello_api import app client = TestClient(app) print(client.get("/").json()) print(client.get("/square/12").json()) print(client.get("/greet", params={"name": "Sara"}).json()) bad = client.get("/square/twelve") # not a number! print(bad.status_code, bad.json()["detail"][0]["msg"])
لما بعتنا كلمة بدل رقم، FastAPI رفض الطلب لوحده برسالة واضحة وكود 422، من غير ما نكتب سطر validation واحد. ده من الـ type hint number: int.
| الكود | معناه |
|---|---|
200 | تمام، وده الرد |
404 | اللينك ده مش موجود |
422 | البيانات اللي بعتها شكلها غلط |
500 | حصلت مشكلة جوه السيرفر، يعني bug عندك |
GET طلب بيجيب بيانات من غير ما يغير حاجة.POST طلب بيبعت بيانات في الـ body، وده اللي هنستخدمه للتوقعات.endpoint لينك محدد بيعمل حاجة محددة، زي /predict.