الدرس 2 من 8

أول API بـ FastAPI

الـ API هو الشباك اللي التطبيقات التانية بتكلم منه الموديل بتاعك.

يعني إيه API؟

زي الجرسون في مطعم: الزبون (تطبيق موبايل أو موقع) مبيدخلش المطبخ. بيدي الطلب للجرسون بشكل معين، والجرسون يرجعله الأكل. الـ API بيستقبل طلبات على لينكات معينة (endpoints)، وينفذ، ويرجع النتيجة غالباً بصيغة JSON.

FastAPI أشهر مكتبة بايثون لده دلوقتي: سريعة، وسهلة، وبتعمل صفحة توثيق تفاعلية لوحدها. وفاكر الـ decorators من المرحلة ٢؟ هنا هتشوفها في كل حتة.

terminal
pip install "fastapi[standard]"
hello_api.py
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}

شغّله وجرّبه

terminal
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 من غير ما تشغل سيرفر:

try_hello.py
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.
الدرس اللي فات