שרת FastApi על דוקר ב10 דקות


דרישות: היכרות עם פייתון, עם web frameworks (כקונספט) והיכרות בסיסית עם דוקר.

שתי השחקניות החזקות ביותר כיום בתחום ה web frameworks לפייתון הן django ו flask. הפוסט של היום מתעסק בשחקנית החדשה והסקסית בתחום שנכתבה על ידי tiangolo ובעיני מסמלת את כל מה שטוב ויפה ב open source software.
FastApi הוא web framework פייתוני מודרני וחדשני אשר נועד ליצירת APIs. הוא נבנה בעיקרו על הענקיות starlette (לניהול העבודה ב web) ועל pydantic (לולידציית data).

הפיצ׳רים העיקריים בהם הכלי מתגאה הם - מהירות (ביצועים), מהירות קידוד, הפחתת באגים (כתוצאה מהפיכת תהליכים שהיו נכתבים ידנית לאוטומטיים), אינטואיטיביות, פשטות, רובסטיות, וסטנדרטיות (עבודה עם JSON schemas ו OpenApi).

לכלי קיימות יכולות רבות אותן אני ממליץ לכם לקרוא בעיון בדוקונטציה הרשמית  (דרך אגב, אחת הדוקומנטציות הטובות שיצא לי לראות).
בפוסט הזה אתמקד ביצירת API פשוט באמצעות הכלי (מעין hello-world) ובהמשך אגע באיזורים קצת יותר מתקדמים כמו חיבור DB, בדיקות, א-סינכרוניות, authorization ועוד טיפים ויכולות מגניבות בהן יצא לי להתקל.

יצירת API פשוט

נתקין את התלויות הבאות (רצוי בתוך סביבה וירטואלית):

pip install fastapi "uvicorn[standard]"

נכתוב לקובץ main.py את התוכן הבא:

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def item(item_id: int):
return {"item_id": item_id}
view raw main.py hosted with ❤ by GitHub

הסבר קצר:
בקובץ אנחנו רואים יצירת מופע של המחלקה FastAPI באצמעותה אנחנו ממפים בין הבקשות שהולכות להגיע אל השרת אל הפונקציות המתאימות להן.
ניתן לראות שתי פונקציות שיצרנו, root ו item כשאל root נגיע כשנשלח בקשת get אל הכתובת של האפליקציה שלנו מבלי שום ניתוב (/http://localhost:8000 במקרה הזה) ואל item נגיע כשנשלח בקשת get אל /item בכתובת שלנו עם מספר כפרמטר (אותו מספר יחזור בתגובה לבקשה)

כעת נשאר רק להריץ את השרת הקטן שלנו לוקאלית עם הפקודה:
uvicorn main:app --reload

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


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

דוקומנטציה אוטומטית

אחד הפיצ׳רים המגניבים ביותר ב FastAPI הוא דוקומנטציית ה Swagger האוטומטית שהוא מייצר.
ניתן לגלוש ל localhost:8000/docs ולראות את הקסם :)

הרצה על דוקר קונטיינר

נכתוב Dockerfile פשוט בתיקיה הראשית עם השלבים הבאים
# The base docker image we want to use
FROM python:3.9
# The directory we want to deploy our code to
WORKDIR /code
# Copy requrirement.txt to /code
COPY ./requirements.txt /code/requirements.txt
# Install the python requirements inside the image
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# Copy the entire app folder
COPY ./app /code/app
# The the command that'll be executed when running a container from that image
# trigger uvicorn tool, with the file app/main.py and the FastAPI variable named app and listen to all IPs in port 80
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
view raw Dockerfile hosted with ❤ by GitHub


כעת נבנה את ה image באמצעות הפקודה:

docker build -t tomercode-fastapi .

הפרמטר t מציין את התגית של ה image בה נוכל להשתמש כדי לא לעבוד עם ה hash שלו והנקודה בסוף מציינת מאיפה לבנות.

ואז נריץ את את השרת באמצעות הפקודה run:

docker run -d --name fastapi-container -p 80:80 tomercode-fastapi

הפרמטר d יגרום להרצה ברקע, עם p אנחנו מגדירים לאיזה פורט הקונטיינר מאזין (צד שמאל של הנקודותיים) ולאיזה פורט התקשורת מועברת בתוך הקונטיינר (צד ימין), עם name נגדיר שם לקונטיינר כדי שנוכל לפנות אליו בקלות ולאחר מכן נכתוב את התגית של ה image אותו נרצה להריץ.

עכשיו הקונטיינר אמור לרוץ ובתוכו אפליקציית ה web הפשוטה שכתבנו ב10 דק עם FastAPI.
נגלוש ל http://127.0.0.1 ונראה שהאפליקציה שלנו רצה

סיכום

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

תגובות

פוסטים פופולריים מהבלוג הזה

קודמתי לדרגת סיניור במיקרוסופט - מה למדתי בדרך

מהם קבצי DLL ואיך להשתמש בהם?

מדריך: כיצד לבחור ואיך להתקין Visual Studio 2017