לדלג לתוכן

FastAPI

FastAPI

תשתית FastAPI, ביצועים גבוהים, קלה ללמידה, מהירה לתכנות, מוכנה לסביבת ייצור

Test Coverage Package version Supported Python versions


תיעוד: 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."

Kabir Khan - Microsoft (ref)

"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]"

Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)

"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)

"I’m over the moon excited about FastAPI. It’s so fun!"

Brian Okken - Python Bytes podcast host (ref)

"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."

Timothy Crosley - Hug creator (ref)

"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 [...]"

Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)

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):

Swagger UI

תיעוד אלטרנטיבי

כעת פנו לכתובת http://127.0.0.1:8000/redoc.

אתם תראו תיעוד אלטרנטיבי (מסופק על ידי 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.

  • התיעוד האוטומטי יתעדכן, כולל הגוף החדש:

Swagger UI

  • לחצו על הכפתור "Try it out", הוא יאפשר לכם למלא את הפרמטרים ולעבוד ישירות מול ה - API.

Swagger UI interaction

  • אחר כך לחצו על הכפתור "Execute", האתר יתקשר עם ה - API שלכם, ישלח את הפרמטרים, ישיג את התוצאות ואז יראה אותן על המסך:

Swagger UI interaction

שדרוג התיעוד האלטרנטיבי

כעת פנו לכתובת http://127.0.0.1:8000/redoc.

  • התיעוד האלטרנטיבי גם יראה את פרמטר השאילתא והגוף החדשים.

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 ...

...וראו איך העורך שלכם משלים את המאפיינים ויודע את הטיפוסים שלהם:

editor support

לדוגמא יותר שלמה שכוללת עוד תכונות, ראו את המדריך - למשתמש.

התראת ספוילרים: המדריך - למשתמש כולל:

  • הכרזה על פרמטרים ממקורות אחרים ושונים כגון: כותרות, עוגיות, טפסים ו - קבצים.
  • איך לקבוע מגבלות אימות בעזרת 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:

בשימוש Starlette:

  • httpx - דרוש אם ברצונכם להשתמש ב - TestClient.
  • jinja2 - דרוש אם ברצונכם להשתמש בברירת המחדל של תצורת הטמפלייטים.
  • python-multipart - דרוש אם ברצונכם לתמוך ב "פרסור" טפסים, באצמעות request.form().
  • itsdangerous - דרוש אם ברצונכם להשתמש ב - SessionMiddleware.
  • pyyaml - דרוש אם ברצונכם להשתמש ב - SchemaGenerator של Starlette (כנראה שאתם לא צריכים את זה עם FastAPI).
  • ujson - דרוש אם ברצונכם להשתמש ב - UJSONResponse.

בשימוש FastAPI / Starlette:

  • uvicorn - לשרת שטוען ומגיש את האפליקציה שלכם.
  • orjson - דרוש אם ברצונכם להשתמש ב - ORJSONResponse.

תוכלו להתקין את כל אלו באמצעות pip install "fastapi[all]".

רשיון

הפרויקט הזה הוא תחת התנאים של רשיון MIT.