You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

30 KiB

FastAPI

FastAPI

FastAPI framework, υψηλή απόδοση, εύκολο στην εκμάθηση, έτοιμο για χρήση στην παραγωγή

Test Coverage Package version Supported Python versions


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 και ορισμένα προϊόντα Γραφείου."

Kabir Khan - Microsoft (ref)

"Υιοθετήσαμε τη βιβλιοθήκη FastAPI για να δημιουργήσουμε έναν διακομιστή REST που μπορεί να ερωτηθεί για τη λήψη προβλέψεων. [για το Ludwig]"

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

"Το Netflix είναι στην ευχάριστη θέση να ανακοινώσει την κυκλοφορία ανοιχτού κώδικα του πλαισίου ενορχήστρωσης διαχείριση κρίσεων: Dispatch! [κατασκευάστηκε με το FastAPI]"

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

"Είναι απόλαυση να δημιουργείς εφαρμογές ιστού με το FastAPI!"

Brian Okken - Python Bytes podcast host (ref)

"Ειλικρινά, αυτό που έχετε φτιάξει φαίνεται εξαιρετικά συμπαγές και γυαλισμένο. Από πολλές απόψεις, είναι αυτό που ήθελα - είναι πραγματικά εμπνευσμένο να βλέπεις κάποιον να το κατασκευάζει."

Timothy Crosley - Hug creator (ref)

"Αν θέλετε να μάθετε ένα σύγχρονο framework για τη δημιουργία REST API, ρίξτε μια ματιά στο FastAPI [...] Είναι γρήγορο, εύκολο στη χρήση και εύκολο στην εκμάθηση [...]"

"Έχουμε αλλάξει στο FastAPI για τα API [...] Νομίζω ότι θα σου αρέσει [...]"

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

"Αν κάποιος θέλει να δημιουργήσει ένα Python API παραγωγής, θα συνιστούσα ανεπιφύλακτα το FastAPI. Είναι όμορφα σχεδιασμένο, απλό στη χρήση και πολύ επεκτάσιμο, έχει γίνει βασικό συστατικό στην πρώτη στρατηγική ανάπτυξης του API και οδηγεί πολλούς αυτοματισμούς και υπηρεσίες, όπως το Virtual TAC Engineer."

Deon Pillsbury - Cisco (ref)

Typer, το FastAPI των CLI

Εάν δημιουργείτε μια εφαρμογή CLI που θα χρησιμοποιείται στο τερματικό αντί για ένα web API, ρίξτε μια ματιά Typer.

Ο Typer είναι το μικρό αδερφάκι του FastAPI. Και προορίζεται να είναι το FastAPI των CLI. ⌨️ 🚀

Απαιτήσεις

Το FastAPI στέκεται στους ώμους γιγάντων:

  • Starlette για τα τμήματα Ιστού.
  • Pydantic για τα μέρη δεδομένων.

Εγκατάσταση

Δημιουργήστε και ενεργοποιήστε ένα εικονικό περιβάλλον και στη συνέχεια εγκαταστήστε το 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):

Swagger UI

Εναλλακτική τεκμηρίωση API

Και τώρα, μεταβείτε στη διεύθυνση http://127.0.0.1:8000/redoc.

Θα δείτε την εναλλακτική αυτόματη τεκμηρίωση (παρέχεται από το 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 θα ενημερωθεί αυτόματα, συμπεριλαμβάνοντας το νέο σώμα:

Swagger UI

  • Κάντε κλικ στο κουμπί "Try it out", το οποίο σας επιτρέπει να συμπληρώσετε τις παραμέτρους και να αλληλεπιδράσετε απευθείας με το API:

Swagger UI interaction

  • Στη συνέχεια, κάντε κλικ στο κουμπί "Execute", η διεπαφή χρήστη θα επικοινωνήσει με το API σας, θα στείλει τις παραμέτρους, θα λάβει τα αποτελέσματα και θα τα εμφανίσει στην οθόνη:

Swagger UI interaction

Αναβάθμιση εναλλακτικής τεκμηρίωσης API

Και τώρα, μεταβείτε στη διεύθυνση http://127.0.0.1:8000/redoc.

  • Η εναλλακτική τεκμηρίωση θα αντικατοπτρίζει επίσης τη νέα παράμετρο ερωτήματος και το σώμα:

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.
    • Μοντέλα βάσης δεδομένων.
    • ...και πολλά περισσότερα.
  • Αυτόματη διαδραστική τεκμηρίωση 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 ...

...και δείτε πώς ο συντάκτης σας θα ολοκληρώνει αυτόματα τα χαρακτηριστικά και θα γνωρίζει τους τύπους τους:

editor support

Για ένα πιο ολοκληρωμένο παράδειγμα που περιλαμβάνει περισσότερες δυνατότητες, δείτε τον Οδηγό χρήσης.

Προσοχή: ο οδηγός χρήσης περιλαμβάνει:

  • Δήλωση παραμέτρων από διαφορετικά σημεία όπως: 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:

Χρησιμοποιούνται από το 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.