30 KiB
FastAPI
FastAPI framework, υψηλή απόδοση, εύκολο στην εκμάθηση, έτοιμο για χρήση στην παραγωγή
Tεκμηρίωση κώδικα: https://fastapi.tiangolo.com
Πηγαίος κώδικας: https://github.com/fastapi/fastapi
FastAPI, είναι ένα σύγχρονο, γρήγορο (υψηλής απόδοσης) web framework για τη δημιουργία API (Advanced Programming Interface | Προηγμένη διεπαφή προγραμματισμού) με Python που βασίζεται σε τυπικές υποδείξεις τύπου Python.
Τα βασικά χαρακτηριστικά είναι:
- Yψηλή απόδοση: Στο ίδιο επίπεδο με NodeJS και Go (χάρη στo Starlette και το Pydantic). Ένα από τα πιο γρήγορα διαθέσιμα Python web framework.
- Γρήγορη κωδικοποίηση: Αυξάνει την ταχύτητα εγγραφής κώδικα κατά περίπου 200% έως 300%. *
- Λιγότερα σφάλματα: Μειώστε περίπου το 40% των σφαλμάτων που προκαλούνται από ανθρώπους (προγραμματιστές). *
- Διαισθητικό: Yποστήριξη για βοηθητικά προγράμματα συμπλήρωσης κώδικα. Λιγότερος χρόνος αποσφαλμάτωσης.
- Εύκολο: Σχεδιασμένο για να είναι εύκολο στη χρήση και στην εκμάθηση. Λιγότερος χρόνος ανάγνωσης εγγράφων.
- Σύντομο: Ελαχιστοποιήστε την αντιγραφή κώδικα. Πολλαπλές δυνατότητες από κάθε δήλωση παραμέτρου.
- Εύρωστο: Λάβετε κώδικα έτοιμο για παραγωγή. Με αυτόματη διαδραστική τεκμηρίωση.
- Βασισμένο σε πρότυπα: Με βάση (και πλήρως συμβατό με) τα ανοιχτά πρότυπα για API: OpenAPI (παλαιότερα γνωστό ως Swagger) και JSON Schema.
* εκτίμηση που βασίζεται σε δοκιμές σε μια εσωτερική ομάδα ανάπτυξης, κατά την κατασκευή εφαρμογών παραγωγής.
Χορηγοί
{% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %}
Απόψεις
"[...] Χρησιμοποιώ το FastAPI πολύ συχνά [...] Στην πραγματικότητα σκοπεύω να το χρησιμοποιήσω για όλες τις υπηρεσίες της ομάδας μου ML services at Microsoft. Ορισμένα από αυτά ενσωματώνονται στο βασικό προϊόν Windows και ορισμένα προϊόντα Γραφείου."
"Υιοθετήσαμε τη βιβλιοθήκη FastAPI για να δημιουργήσουμε έναν διακομιστή REST που μπορεί να ερωτηθεί για τη λήψη προβλέψεων. [για το Ludwig]"
"Το Netflix είναι στην ευχάριστη θέση να ανακοινώσει την κυκλοφορία ανοιχτού κώδικα του πλαισίου ενορχήστρωσης διαχείριση κρίσεων: Dispatch! [κατασκευάστηκε με το FastAPI]"
"Είναι απόλαυση να δημιουργείς εφαρμογές ιστού με το FastAPI!"
"Ειλικρινά, αυτό που έχετε φτιάξει φαίνεται εξαιρετικά συμπαγές και γυαλισμένο. Από πολλές απόψεις, είναι αυτό που ήθελα - είναι πραγματικά εμπνευσμένο να βλέπεις κάποιον να το κατασκευάζει."
"Αν θέλετε να μάθετε ένα σύγχρονο framework για τη δημιουργία REST API, ρίξτε μια ματιά στο FastAPI [...] Είναι γρήγορο, εύκολο στη χρήση και εύκολο στην εκμάθηση [...]"
"Έχουμε αλλάξει στο FastAPI για τα API [...] Νομίζω ότι θα σου αρέσει [...]"
"Αν κάποιος θέλει να δημιουργήσει ένα Python API παραγωγής, θα συνιστούσα ανεπιφύλακτα το FastAPI. Είναι όμορφα σχεδιασμένο, απλό στη χρήση και πολύ επεκτάσιμο, έχει γίνει βασικό συστατικό στην πρώτη στρατηγική ανάπτυξης του API και οδηγεί πολλούς αυτοματισμούς και υπηρεσίες, όπως το Virtual TAC Engineer."
Typer, το FastAPI των CLI
Εάν δημιουργείτε μια εφαρμογή CLI που θα χρησιμοποιείται στο τερματικό αντί για ένα web API, ρίξτε μια ματιά Typer.
Ο Typer είναι το μικρό αδερφάκι του FastAPI. Και προορίζεται να είναι το FastAPI των CLI. ⌨️ 🚀
Απαιτήσεις
Το FastAPI στέκεται στους ώμους γιγάντων:
Εγκατάσταση
Δημιουργήστε και ενεργοποιήστε ένα εικονικό περιβάλλον και στη συνέχεια εγκαταστήστε το FastAPI:
$ pip install "fastapi[standard]"
---> 100%
Σημείωση: Βεβαιωθείτε ότι έχετε βάλει το "fastapi[standard]"
σε εισαγωγικά για να διασφαλίσετε ότι λειτουργεί σε όλα τα τερματικά.
Παράδειγμα
Δημιουργήστε το
- Δημιουργήστε ένα αρχείο
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
στις τεκμηριώσεις.
Εκτελέστε το
Εκτελέστε τον διακομιστή με:
$ fastapi dev main.py
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
│ Serving at: http://127.0.0.1:8000 │
│ │
│ API docs: http://127.0.0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [2248755] using WatchFiles
INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.
Σχετικά με την εντολή fastapi dev main.py
...
Η εντολή fastapi dev
διαβάζει το αρχείο σας main.py
, ανιχνεύει την εφαρμογή FastAPI μέσα σε αυτό και εκκινεί έναν διακομιστή χρησιμοποιώντας το Uvicorn.
Από προεπιλογή, το fastapi dev
θα ξεκινήσει με ενεργοποιημένη την αυτόματη επαναφόρτωση για τοπική ανάπτυξη.
Μπορείτε να διαβάσετε περισσότερα σχετικά με αυτό στις τεκμηριώσεις του CLI του FastAPI.
Ελέγξτε το
Ανοίξτε τον περιηγητή σας στη διεύθυνση 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
που είναιstr
.
Διαδραστική τεκμηρίωση API
Τώρα μεταβείτε στη διεύθυνση http://127.0.0.1:8000/docs.
Θα δείτε την αυτόματη διαδραστική τεκμηρίωση API (παρέχεται από το Swagger UI):
Εναλλακτική τεκμηρίωση API
Και τώρα, μεταβείτε στη διεύθυνση http://127.0.0.1:8000/redoc.
Θα δείτε την εναλλακτική αυτόματη τεκμηρίωση (παρέχεται από το ReDoc):
Παράδειγμα αναβάθμισης
Τώρα τροποποιήστε το αρχείο main.py
ώστε να δέχεται ένα σώμα από ένα αίτημα PUT
.
Ορίστε το σώμα χρησιμοποιώντας τυπικούς τύπους Python, χάρη στο 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}
Ο διακομιστής fastapi dev
θα πρέπει να επανεκκινηθεί αυτόματα.
Αναβάθμιση διαδραστικής τεκμηρίωσης API
Τώρα μεταβείτε στη διεύθυνση http://127.0.0.1:8000/docs.
- Η διαδραστική τεκμηρίωση API θα ενημερωθεί αυτόματα, συμπεριλαμβάνοντας το νέο σώμα:
- Κάντε κλικ στο κουμπί "Try it out", το οποίο σας επιτρέπει να συμπληρώσετε τις παραμέτρους και να αλληλεπιδράσετε απευθείας με το API:
- Στη συνέχεια, κάντε κλικ στο κουμπί "Execute", η διεπαφή χρήστη θα επικοινωνήσει με το API σας, θα στείλει τις παραμέτρους, θα λάβει τα αποτελέσματα και θα τα εμφανίσει στην οθόνη:
Αναβάθμιση εναλλακτικής τεκμηρίωσης API
Και τώρα, μεταβείτε στη διεύθυνση http://127.0.0.1:8000/redoc.
- Η εναλλακτική τεκμηρίωση θα αντικατοπτρίζει επίσης τη νέα παράμετρο ερωτήματος και το σώμα:
Ανακεφαλαίωση
Συνοψίζοντας, δηλώνετε μία φορά τους τύπους παραμέτρων, σώματος κ.λπ. ως παραμέτρους συναρτήσεων.
Και αυτό το κάνετε χρησιμοποιώντας τους τυπικούς, σύγχρονους τύπους της Python.
Δεν χρειάζεται να μάθετε νέα σύνταξη, μεθόδους ή κλάσεις μιας συγκεκριμένης βιβλιοθήκης, κ.λπ.
Απλά την τυπική Python.
Για παράδειγμα, για έναν int
:
item_id: int
ή για ένα πιο σύνθετο μοντέλο Item
:
item: Item
...και με αυτήν τη μοναδική δήλωση έχετε:
- Υποστήριξη από τον συντάκτη, συμπεριλαμβανομένων:
- Συμπλήρωσης.
- Ελέγχων τύπου.
- Επικύρωση δεδομένων:
- Αυτόματα και σαφή σφάλματα όταν τα δεδομένα είναι μη έγκυρα.
- Επικύρωση ακόμη και για βαθιά φωλιασμένα αντικείμενα JSON.
- Μετατροπή δεδομένων εισόδου: από το δίκτυο σε δεδομένα και τύπους Python. Ανάγνωση από:
- JSON.
- Path parameters (Παραμέτρους διαδρομής).
- Query parameters (Παραμέτρους ερωτήματος).
- Cookies.
- Headers.
- Forms (Φόρμες).
- Files (Αρχεία).
- Μετατροπή δεδομένων εξόδου: μετατροπή από δεδομένα και τύπους Python σε δεδομένα δικτύου (ως JSON):
- Μετατροπή τύπων Python (
str
,int
,float
,bool
,list
, κ.λπ.). - Αντικείμενα
datetime
. - Αντικείμενα
UUID
. - Μοντέλα βάσης δεδομένων.
- ...και πολλά περισσότερα.
- Μετατροπή τύπων Python (
- Αυτόματη διαδραστική τεκμηρίωση API, συμπεριλαμβανομένων 2 εναλλακτικών διεπαφών χρήστη:
- 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 αυτόματα.
- Τεκμηριώνει τα πάντα με το OpenAPI, το οποίο μπορεί να χρησιμοποιηθεί από:
- Διαδραστικά συστήματα τεκμηρίωσης.
- Συστήματα αυτόματης δημιουργίας κώδικα πελάτη, για πολλές γλώσσες.
- Παρέχει 2 διαδραστικές διεπαφές ιστού για τεκμηρίωση απευθείας.
Μόλις αγγίξαμε την επιφάνεια, αλλά ήδη καταλαβαίνετε την ιδέα για το πώς λειτουργούν όλα.
Δοκιμάστε να αλλάξετε τη γραμμή με:
return {"item_name": item.name, "item_id": item_id}
...από:
... "item_name": item.name ...
...προς:
... "item_price": item.price ...
...και δείτε πώς ο συντάκτης σας θα ολοκληρώνει αυτόματα τα χαρακτηριστικά και θα γνωρίζει τους τύπους τους:
Για ένα πιο ολοκληρωμένο παράδειγμα που περιλαμβάνει περισσότερες δυνατότητες, δείτε τον Οδηγό χρήσης.
Προσοχή: ο οδηγός χρήσης περιλαμβάνει:
- Δήλωση παραμέτρων από διαφορετικά σημεία όπως: headers, cookies, πεδία φόρμας και αρχεία.
- Πώς να ορίσετε περιορισμούς επικύρωσης, όπως
maximum_length
ήregex
. - Ένα πολύ ισχυρό και εύκολο στη χρήση σύστημα Εισαγωγής Εξαρτήσεων.
- Ασφάλεια και αυθεντικοποίηση, συμπεριλαμβανομένης της υποστήριξης για OAuth2 με JWT tokens και HTTP Basic αυθεντικοποίηση.
- Πιο προχωρημένες (αλλά εξίσου εύκολες) τεχνικές για τη δήλωση βαθιά φωλιασμένων JSON μοντέλων (χάρη στο Pydantic).
- Ενσωμάτωση GraphQL με το Strawberry και άλλες βιβλιοθήκες.
- Πολλές επιπλέον δυνατότητες (χάρη στο Starlette) όπως:
- WebSockets
- εξαιρετικά εύκολα τεστ βασισμένα σε HTTPX και
pytest
- CORS
- Cookie Sessions
- ...και πολλά άλλα.
Απόδοση
Ανεξάρτητα benchmarks από το TechEmpower δείχνουν ότι οι εφαρμογές FastAPI που τρέχουν με Uvicorn είναι από τα ταχύτερα διαθέσιμα Python frameworks, μόνο κάτω από τα ίδια τα Starlette και Uvicorn (που χρησιμοποιούνται εσωτερικά από το FastAPI). (*)
Για να κατανοήσετε περισσότερα, δείτε την ενότητα Benchmarks.
Εξαρτήσεις
Το FastAPI εξαρτάται από τα Pydantic και Starlette.
standard
Εξαρτήσεις
Όταν εγκαθιστάτε το FastAPI με την εντολή pip install "fastapi[standard]"
περιλαμβάνει την ομάδα standard
προαιρετικών εξαρτήσεων:
Χρησιμοποιούνται από το Pydantic:
email-validator
- για επικύρωση email.
Χρησιμοποιούνται από το Starlette:
httpx
- Απαραίτητο αν θέλετε να χρησιμοποιήσετε τοTestClient
.jinja2
- Απαραίτητο αν θέλετε να χρησιμοποιήσετε την προεπιλεγμένη ρύθμιση για templates.python-multipart
- Απαραίτητο αν θέλετε να υποστηρίξετε "ανάλυση" φορμών με τοrequest.form()
.
Χρησιμοποιούνται από FastAPI / Starlette:
uvicorn
- για τον server που φορτώνει και εξυπηρετεί την εφαρμογή σας. Αυτό περιλαμβάνει τοuvicorn[standard]
, το οποίο περιέχει ορισμένες εξαρτήσεις (π.χ.uvloop
) που απαιτούνται για υψηλή απόδοση εξυπηρέτησης.fastapi-cli
- για την παροχή της εντολήςfastapi
.
Χωρίς τις standard
Εξαρτήσεις
Αν δεν θέλετε να συμπεριλάβετε τις προαιρετικές εξαρτήσεις standard
, μπορείτε να εγκαταστήσετε με pip install fastapi
αντί για pip install "fastapi[standard]"
.
Πρόσθετες Προαιρετικές Εξαρτήσεις
Υπάρχουν ορισμένες πρόσθετες εξαρτήσεις που μπορεί να θέλετε να εγκαταστήσετε.
Πρόσθετες προαιρετικές εξαρτήσεις για Pydantic:
pydantic-settings
- για τη διαχείριση ρυθμίσεων.pydantic-extra-types
- για πρόσθετους τύπους που μπορούν να χρησιμοποιηθούν με το Pydantic.
Πρόσθετες προαιρετικές εξαρτήσεις για το FastAPI:
orjson
- Απαραίτητο αν θέλετε να χρησιμοποιήσετε τοORJSONResponse
.ujson
- Απαραίτητο αν θέλετε να χρησιμοποιήσετε τοUJSONResponse
.
Άδεια Χρήσης
Αυτό το έργο διανέμεται υπό τους όρους της άδειας MIT.