FastAPI
תשתית FastAPI, ביצועים גבוהים, קלה ללמידה, מהירה לתכנות, מוכנה לסביבת ייצור
תיעוד: https://fastapi.tiangolo.com
קוד: https://github.com/tiangolo/fastapi
FastAPI היא תשתית רשת מודרנית ומהירה (ביצועים גבוהים) לבניית ממשקי תכנות יישומים (API) עם פייתון 3.6+ בהתבסס על רמזי טיפוסים סטנדרטיים.
תכונות המפתח הן:
-
מהירה: ביצועים גבוהים מאוד, בקנה אחד עם NodeJS ו - Go (תודות ל - Starlette ו - Pydantic). אחת מתשתיות הפייתון המהירות ביותר.
-
מהירה לתכנות: הגבירו את מהירות פיתוח התכונות החדשות בכ - %200 עד %300. *
- פחות שגיאות: מנעו כ - %40 משגיאות אנוש (מפתחים). *
- אינטואיטיבית: תמיכת עורך מעולה. השלמה בכל מקום. פחות זמן ניפוי שגיאות.
- קלה: מתוכננת להיות קלה לשימוש וללמידה. פחות זמן קריאת תיעוד.
- קצרה: מזערו שכפול קוד. מספר תכונות מכל הכרזת פרמטר. פחות שגיאות.
- חסונה: קבלו קוד מוכן לסביבת ייצור. עם תיעוד אינטרקטיבי אוטומטי.
- מבוססת סטנדרטים: מבוססת על (ותואמת לחלוטין ל -) הסטדנרטים הפתוחים לממשקי תכנות יישומים: OpenAPI (ידועים לשעבר כ - Swagger) ו - JSON Schema.
* הערכה מבוססת על בדיקות של צוות פיתוח פנימי שבונה אפליקציות בסביבת ייצור.
נותני חסות¶
דעות¶
"[...] I'm using FastAPI a ton these days. [...] I'm actually planning to use it for all of my team's ML services at Microsoft. Some of them are getting integrated into the core Windows product and some Office products."
"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]"
"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]"
"I’m over the moon excited about FastAPI. It’s so fun!"
"Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted Hug to be - it's really inspiring to see someone build that."
"If you're looking to learn one modern framework for building REST APIs, check out FastAPI [...] It's fast, easy to use and easy to learn [...]"
"We've switched over to FastAPI for our APIs [...] I think you'll like it [...]"
Typer, ה - FastAPI של ממשקי שורת פקודה (CLI).¶
אם אתם בונים אפליקציית CLI לשימוש במסוף במקום ממשק רשת, העיפו מבט על Typer.
Typer היא אחותה הקטנה של FastAPI. ומטרתה היא להיות ה - FastAPI של ממשקי שורת פקודה. ⌨️ 🚀
תלויות¶
פייתון 3.6+
FastAPI עומדת על כתפי ענקיות:
התקנה¶
$ pip install fastapi
---> 100%
תצטרכו גם שרת ASGI כגון Uvicorn או Hypercorn.
$ pip install "uvicorn[standard]"
---> 100%
דוגמא¶
צרו אותה¶
- צרו קובץ בשם
main.py
עם:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
או השתמשו ב - async def
...
אם הקוד שלכם משתמש ב - async
/ await
, השתמשו ב - async def
:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
שימו לב:
אם אינכם יודעים, בדקו את פרק "ממהרים?" על async
ו - await
בתיעוד.
הריצו אותה¶
התחילו את השרת עם:
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
על הפקודה uvicorn main:app --reload
...
הפקודה uvicorn main:app
מתייחסת ל:
main
: הקובץmain.py
(מודול פייתון).app
: האובייקט שנוצר בתוךmain.py
עם השורהapp = FastAPI()
.--reload
: גרמו לשרת להתאתחל לאחר שינויים בקוד. עשו זאת רק בסביבת פיתוח.
בדקו אותה¶
פתחו את הדפדפן שלכם בכתובת http://127.0.0.1:8000/items/5?q=somequery.
אתם תראו תגובת JSON:
{"item_id": 5, "q": "somequery"}
כבר יצרתם API ש:
- מקבל בקשות HTTP בנתיבים
/
ו -/items/{item_id}
. - שני ה נתיבים מקבלים בקשות
GET
(ידועות גם כמתודות HTTP). - ה נתיב
/items/{item_id}
כולל *פרמטר נתיב_item_id
שאמור להיותint
. - ה נתיב
/items/{item_id}
*פרמטר שאילתא_ אופציונליq
.
תיעוד API אינטרקטיבי¶
כעת פנו לכתובת http://127.0.0.1:8000/docs.
אתם תראו את התיעוד האוטומטי (מסופק על ידי Swagger UI):
תיעוד אלטרנטיבי¶
כעת פנו לכתובת http://127.0.0.1:8000/redoc.
אתם תראו תיעוד אלטרנטיבי (מסופק על ידי ReDoc):
שדרוג לדוגמא¶
כעת ערכו את הקובץ main.py
כך שיוכל לקבל גוף מבקשת PUT
.
הגדירו את הגוף בעזרת רמזי טיפוסים סטנדרטיים, הודות ל - Pydantic
.
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
השרת אמול להתאתחל אוטומטית (מאחר והוספתם --reload
לפקודת uvicorn
שלמעלה).
שדרוג התיעוד האינטרקטיבי¶
כעת פנו לכתובת http://127.0.0.1:8000/docs.
- התיעוד האוטומטי יתעדכן, כולל הגוף החדש:
- לחצו על הכפתור "Try it out", הוא יאפשר לכם למלא את הפרמטרים ולעבוד ישירות מול ה - API.
- אחר כך לחצו על הכפתור "Execute", האתר יתקשר עם ה - API שלכם, ישלח את הפרמטרים, ישיג את התוצאות ואז יראה אותן על המסך:
שדרוג התיעוד האלטרנטיבי¶
כעת פנו לכתובת http://127.0.0.1:8000/redoc.
- התיעוד האלטרנטיבי גם יראה את פרמטר השאילתא והגוף החדשים.
סיכום¶
לסיכום, אתם מכריזים ** פעם אחת** על טיפוסי הפרמטרים, גוף וכו' כפרמטרים לפונקציה.
אתם עושים את זה עם טיפוסי פייתון מודרניים.
אתם לא צריכים ללמוד תחביר חדש, מתודות או מחלקות של ספרייה ספיציפית, וכו'
רק פייתון 3.6+ סטנדרטי.
לדוגמא, ל - int
:
item_id: int
או למודל Item
מורכב יותר:
item: Item
...ועם הכרזת הטיפוס האחת הזו אתם מקבלים:
- תמיכת עורך, כולל:
- השלמות.
- בדיקת טיפוסים.
- אימות מידע:
- שגיאות ברורות ואטומטיות כאשר מוכנס מידע לא חוקי .
- אימות אפילו לאובייקטי JSON מקוננים.
- המרה של מידע קלט: המרה של מידע שמגיע מהרשת למידע וטיפוסים של פייתון. קורא מ:
- JSON.
- פרמטרי נתיב.
- פרמטרי שאילתא.
- עוגיות.
- כותרות.
- טפסים.
- קבצים.
- המרה של מידע פלט: המרה של מידע וטיפוסים מפייתון למידע רשת (כ - JSON):
- המירו טיפוסי פייתון (
str
,int
,float
,bool
,list
, etc). - עצמי
datetime
. - עצמי
UUID
. - מודלי בסיסי נתונים.
- ...ורבים אחרים.
- המירו טיפוסי פייתון (
- תיעוד API אוטומטי ואינטרקטיבית כולל שתי אלטרנטיבות לממשק המשתמש:
- Swagger UI.
- ReDoc.
בחזרה לדוגמאת הקוד הקודמת, FastAPI ידאג:
- לאמת שיש
item_id
בנתיב בבקשותGET
ו -PUT
. - לאמת שה -
item_id
הוא מטיפוסint
בבקשותGET
ו -PUT
.- אם הוא לא, הלקוח יראה שגיאה ברורה ושימושית.
- לבדוק האם קיים פרמטר שאילתא בשם
q
(קריhttp://127.0.0.1:8000/items/foo?q=somequery
) לבקשותGET
.- מאחר והפרמטר
q
מוגדר עם= None
, הוא אופציונלי. - לולא ה -
None
הוא היה חובה (כמו הגוף במקרה שלPUT
).
- מאחר והפרמטר
- לבקשות
PUT
לנתיב/items/{item_id}
, לקרוא את גוף הבקשה כ - JSON:- לאמת שהוא כולל את מאפיין החובה
name
שאמור להיות מטיפוסstr
. - לאמת שהוא כולל את מאפיין החובה
price
שחייב להיות מטיפוסfloat
. - לבדוק האם הוא כולל את מאפיין הרשות
is_offer
שאמור להיות מטיפוסbool
, אם הוא נמצא. - כל זה יעבוד גם לאובייקט JSON מקונן.
- לאמת שהוא כולל את מאפיין החובה
- להמיר מ - JSON ול- JSON אוטומטית.
- לתעד הכל באמצעות OpenAPI, תיעוד שבו יוכלו להשתמש:
- מערכות תיעוד אינטרקטיביות.
- מערכות ייצור קוד אוטומטיות, להרבה שפות.
- לספק ישירות שתי מערכות תיעוד רשתיות.
רק גרדנו את קצה הקרחון, אבל כבר יש לכם רעיון של איך הכל עובד.
נסו לשנות את השורה:
return {"item_name": item.name, "item_id": item_id}
...מ:
... "item_name": item.name ...
...ל:
... "item_price": item.price ...
...וראו איך העורך שלכם משלים את המאפיינים ויודע את הטיפוסים שלהם:
לדוגמא יותר שלמה שכוללת עוד תכונות, ראו את המדריך - למשתמש.
התראת ספוילרים: המדריך - למשתמש כולל:
- הכרזה על פרמטרים ממקורות אחרים ושונים כגון: כותרות, עוגיות, טפסים ו - קבצים.
- איך לקבוע מגבלות אימות בעזרת
maximum_length
אוregex
. - דרך חזקה וקלה להשתמש בהזרקת תלויות.
- אבטחה והתאמתות, כולל תמיכה ב - OAuth2 עם JWT והתאמתות HTTP Basic.
- טכניקות מתקדמות (אבל קלות באותה מידה) להכרזת אובייקטי JSON מקוננים (תודות ל - Pydantic).
- אינטרקציה עם GraphQL דרך Strawberry וספריות אחרות.
- תכונות נוספות רבות (תודות ל - Starlette) כגון:
- WebSockets
- בדיקות קלות במיוחד מבוססות על
requests
ו -pytest
- CORS
- Cookie Sessions
- ...ועוד.
ביצועים¶
בדיקות עצמאיות של TechEmpower הראו שאפליקציות FastAPI שרצות תחת Uvicorn הן מתשתיות הפייתון המהירות ביותר, רק מתחת ל - Starlette ו - Uvicorn עצמן (ש - FastAPI מבוססת עליהן). (*)
כדי להבין עוד על הנושא, ראו את הפרק Benchmarks.
תלויות אופציונליות¶
בשימוש Pydantic:
email_validator
- לאימות כתובות אימייל.
בשימוש Starlette:
httpx
- דרוש אם ברצונכם להשתמש ב -TestClient
.jinja2
- דרוש אם ברצונכם להשתמש בברירת המחדל של תצורת הטמפלייטים.python-multipart
- דרוש אם ברצונכם לתמוך ב "פרסור" טפסים, באצמעותrequest.form()
.itsdangerous
- דרוש אם ברצונכם להשתמש ב -SessionMiddleware
.pyyaml
- דרוש אם ברצונכם להשתמש ב -SchemaGenerator
של Starlette (כנראה שאתם לא צריכים את זה עם FastAPI).ujson
- דרוש אם ברצונכם להשתמש ב -UJSONResponse
.
בשימוש FastAPI / Starlette:
תוכלו להתקין את כל אלו באמצעות pip install "fastapi[all]"
.
רשיון¶
הפרויקט הזה הוא תחת התנאים של רשיון MIT.