לדלג לתוכן

בונים API עם FastAPI ופייתון - הפריימוורק שכותב לכם חצי מהעבודה לבד

אם אתם באים מפייתון ורוצים לבנות API בפעם הראשונה, FastAPI הוא כנראה הכניסה הכי נעימה לעולם הזה שיש היום. הוא לא רק מהיר לכתוב איתו - הוא גם מלמד אתכם הרגלים נכונים כמעט בכפייה, כי הוא פשוט לא נותן לכם לדלג עליהם בקלות. זה הופך אותו לפריימוורק מצוין ללמידה, לא רק לפרודקשן.

למה דווקא FastAPI

שלושה דברים מבדילים אותו משאר האפשרויות בפייתון.

Type hints שהם לא רק תיעוד. בפייתון רגיל, סימוני טיפוסים (type hints) הם בעיקר עזר קריאה. ב-FastAPI הם חלק אקטיבי מהמערכת - הם קובעים איך הנתונים מאומתים, מומרים ומתועדים אוטומטית. אתם כותבים age: int, ו-FastAPI כבר דואג שאם מישהו ישלח מחרוזת שם, הוא יקבל שגיאה ברורה בלי שתכתבו קוד בדיקה בעצמכם.

תיעוד אוטומטי. ברגע שהשרת רץ, יש לכם ממשק Swagger מלא בכתובת /docs שמציג את כל הנתיבים, אילו פרמטרים כל אחד מצפה לקבל, ומאפשר לשלוח בקשות ניסיון ישירות מהדפדפן. זה חוסך שעות של כתיבת תיעוד ידני, ונותן לכם ולכל מי שבודק את הפרויקט שלכם דרך נוחה להבין מה הוא עושה.

תמיכה מובנית באסינכרוניות. FastAPI בנוי מלכתחילה סביב async, כך שכשתגיעו לצורך לטפל בהרבה בקשות במקביל - למשל קריאות למסד נתונים או ל-API חיצוני - הכלים כבר שם, בלי צורך בספריות נוספות.

מודלים עם Pydantic

הליבה האמיתית של FastAPI היא ספריית Pydantic, שדרכה מגדירים איך נתונים אמורים להיראות:

from pydantic import BaseModel

class Note(BaseModel):
    title: str
    content: str
    done: bool = False

המודל הזה הוא לא רק תיאור - הוא גם שכבת אימות. אם מישהו ישלח בקשה בלי שדה title, FastAPI יחזיר שגיאת 422 עם הסבר מדויק איזה שדה חסר, עוד לפני שהקוד שלכם בכלל רץ. זה בדיוק ההפך מבנייה ידנית של בדיקות if על כל שדה - הרבה פחות קוד, והרבה פחות מקום לטעות אנוש.

בניית API קטן להערות - הדוגמה המעשית

בואו נבנה API פשוט לניהול הערות (notes), כדי לראות איך זה מתחבר יחד.

from fastapi import FastAPI, HTTPException

app = FastAPI()
notes: list[Note] = []

@app.get("/notes")
def get_notes():
    return notes

@app.post("/notes")
def create_note(note: Note):
    notes.append(note)
    return note

@app.get("/notes/{index}")
def get_note(index: int):
    if index >= len(notes):
        raise HTTPException(status_code=404, detail="Note not found")
    return notes[index]

שימו לב לכמה דברים כאן. הפרמטר note: Note בפונקציית ה-POST אומר ל-FastAPI לצפות לגוף בקשה שמתאים למודל שהגדרנו, ולאמת אותו אוטומטית. הפרמטר index: int בנתיב עצמו מומר אוטומטית ממחרוזת למספר שלם, ואם מישהו ישלח משהו שהוא לא מספר, יחזור שוב 422 בלי שכתבתם שורת קוד אחת של בדיקה.

הרצה עם uvicorn

FastAPI עצמו הוא רק ההגדרה של האפליקציה - כדי להריץ אותה בפועל צריך שרת ASGI, והנפוץ ביותר הוא uvicorn:

uvicorn main:app --reload

הדגל --reload מפעיל טעינה מחדש אוטומטית בכל שינוי בקוד, מה שהופך את מחזור הפיתוח למהיר משמעותית - אין צורך לעצור ולהפעיל מחדש את השרת ידנית אחרי כל שינוי.

מלכודות נפוצות

לשכוח שהמודל הוא לא רק לקלט. מתחילים רבים מגדירים מודל אחד ומשתמשים בו גם לקבלת נתונים וגם להחזרתם, בלי לשים לב שלפעמים רוצים להסתיר שדות מסוימים בתשובה (למשל סיסמה). ברגע שהפרויקט גדל, שווה להפריד בין מודל קלט למודל פלט.

להתעלם מקודי הסטטוס. קל לזרוק כל שגיאה כ-Exception רגיל, אבל אז FastAPI יחזיר 500 גנרי במקום קוד סטטוס שמתאר את הבעיה בפועל. שימוש נכון ב-HTTPException עם הקוד המתאים (404, 400, 401 וכו') הוא מה שהופך API מ"עובד" ל"מקצועי".

מה מקבלים בסוף

בסוף התהליך יש לכם לא רק API עובד, אלא גם תיעוד חי שמתעדכן אוטומטית, ואימות קלט חינם כמעט לגמרי. זה משלב שמראה למעסיקים שאתם לא רק יודעים לכתוב פייתון, אלא גם מכירים כלים מודרניים שמשמשים בפרודקשן אמיתי.

אנחנו מלמדים את כל הדרך הזו לעומק - מהיסודות של פייתון ועד בניית API מלא עם FastAPI - בקורס צד שרת המלא, עם תרגילים ופרויקטים אמיתיים בדרך.

בואו לבנות את זה יחד ולשאול שאלות כשאתם נתקעים, בקהילה שלנו בדיסקורד.

הצטרפו לקהילה בדיסקורד