# FastAPI
תשתית FastAPI, ביצועים גבוהים, קלה ללמידה, מהירה לתכנות, מוכנה לסביבת ייצור
--- **תיעוד**: https://fastapi.tiangolo.com **קוד**: https://github.com/fastapi/fastapi --- FastAPI היא תשתית רשת מודרנית ומהירה (ביצועים גבוהים) לבניית ממשקי תכנות יישומים (API) עם פייתון 3.6+ בהתבסס על רמזי טיפוסים סטנדרטיים. תכונות המפתח הן: - **מהירה**: ביצועים גבוהים מאוד, בקנה אחד עם NodeJS ו - Go (תודות ל - Starlette ו - Pydantic). [אחת מתשתיות הפייתון המהירות ביותר](#_14). - **מהירה לתכנות**: הגבירו את מהירות פיתוח התכונות החדשות בכ - %200 עד %300. \* - **פחות שגיאות**: מנעו כ - %40 משגיאות אנוש (מפתחים). \* - **אינטואיטיבית**: תמיכת עורך מעולה. השלמה בכל מקום. פחות זמן ניפוי שגיאות. - **קלה**: מתוכננת להיות קלה לשימוש וללמידה. פחות זמן קריאת תיעוד. - **קצרה**: מזערו שכפול קוד. מספר תכונות מכל הכרזת פרמטר. פחות שגיאות. - **חסונה**: קבלו קוד מוכן לסביבת ייצור. עם תיעוד אינטרקטיבי אוטומטי. - **מבוססת סטנדרטים**: מבוססת על (ותואמת לחלוטין ל -) הסטדנרטים הפתוחים לממשקי תכנות יישומים: OpenAPI (ידועים לשעבר כ - Swagger) ו - JSON Schema. \* הערכה מבוססת על בדיקות של צוות פיתוח פנימי שבונה אפליקציות בסביבת ייצור. ## נותני חסות {% if sponsors %} {% for sponsor in sponsors.gold -%}async def
...uvicorn main:app --reload
...app = FastAPI()
.
- --reload
: גרמו לשרת להתאתחל לאחר שינויים בקוד. עשו זאת רק בסביבת פיתוח.
/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`.
```Python hl_lines="4 9-12 25-27"
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`:
```Python
item_id: int
```
או למודל `Item` מורכב יותר:
```Python
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, תיעוד שבו יוכלו להשתמש:
- מערכות תיעוד אינטרקטיביות.
- מערכות ייצור קוד אוטומטיות, להרבה שפות.
- לספק ישירות שתי מערכות תיעוד רשתיות.
---
רק גרדנו את קצה הקרחון, אבל כבר יש לכם רעיון של איך הכל עובד.
נסו לשנות את השורה:
```Python
return {"item_name": item.name, "item_id": item_id}
```
...מ:
```Python
... "item_name": item.name ...
```
...ל:
```Python
... "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).
בשימוש FastAPI / Starlette:
- uvicorn
- לשרת שטוען ומגיש את האפליקציה שלכם.
- orjson
- דרוש אם ברצונכם להשתמש ב - `ORJSONResponse`.
- ujson
- דרוש אם ברצונכם להשתמש ב - `UJSONResponse`.
תוכלו להתקין את כל אלו באמצעות pip install "fastapi[all]"
.
## רשיון
הפרויקט הזה הוא תחת התנאים של רשיון MIT.