Warum sollten Sie FastAPI ausprobieren?

Bild Das Logo stammt aus dem Github FastAPI- Repository


FastAPI ist ein relativ neues Webframework, das in der Programmiersprache Python geschrieben wurde, um REST- (und, wenn Sie es genau wissen, GraphQL-) APIs zu erstellen, die auf neuen Funktionen von Python 3.6+ basieren, z ) Unter anderem integriert sich FastAPI eng in das OpenAPI-Schema und generiert über Swagger und ReDoc automatisch eine Dokumentation für Ihre API


FastAPI basiert auf Starlette und Pydantic .
Starlette ist ein ASGI- Mikro-Framework zum Schreiben von Webanwendungen.
Pydantic - eine Bibliothek zum Parsen und Validieren von Daten basierend auf Python-Typ-Hinweisen.


Was sagen sie über FastAPI?


"[...] Ich verwende FastAPI in den letzten Tagen sehr häufig. [...] Ich habe definitiv vor, es für alle ML-Dienste meines Teams bei Microsoft zu verwenden. Einige davon sind in Windows und einige Office-Produkte integriert."

Kabir Khan - Microsoft ( ref )


"Wenn Sie ein anderes Framework zum Schreiben einer REST-API erlernen möchten, schauen Sie sich FastAPI an. [...] Es ist schnell, einfach zu bedienen und zu erlernen. [...]"

"Jetzt verwenden wir FastAPI für unsere APIs. Ich [...] denke, es wird Ihnen gefallen! [...]"

Ines Montani - Matthew Honnibal - Gründer von Explosion AI - spaCy creators ( ref ) - ( ref )


Minimale API, die mit FastAPI erstellt wurde


Ich werde versuchen, Ihnen zu zeigen, wie Sie eine einfache, aber gleichzeitig nützliche API mit Dokumentation für Entwickler erstellen. Wir werden einen zufälligen Phrasengenerator schreiben!


Installationsvoraussetzungen


pip install wheel -U pip install uvicorn fastapi pydantic 

Neues Modul!
Uvicorn ist ein ASGI-kompatibler Webserver, auf dem wir unsere Anwendung ausführen.


Zunächst legen wir die Grundlage für unsere Anwendung fest.


 from fastapi import FastAPI app = FastAPI(title="Random phrase") 

Diese Anwendung läuft bereits und kann gestartet werden.
Schreiben Sie diesen Befehl in Ihr Terminal und öffnen Sie die Seite im Browser unter http://127.0.0.1:8000/docs .


 uvicorn <__>:app 

Aber während in unserer Anwendung kein einziger Endpunkt angegeben ist - lassen Sie es uns beheben!


Datenbank


Da wir einen Zufallsphrasengenerator schreiben, müssen wir sie offensichtlich irgendwo speichern. Dafür habe ich ein einfaches python-dict .


Erstellen Sie eine db.py Datei und schreiben Sie den Code.


Wir importieren die notwendigen Module:


 import typing import random from pydantic import BaseModel from pydantic import Field 

Danach bestimmen wir zwei Modelle: die Eingabephrase (die, die der Benutzer an uns sendet) und die "Ausgabe" (die, die wir an den Benutzer senden).


 class PhraseInput(BaseModel): """Phrase model""" author: str = "Anonymous" #  .    -   . text: str = Field(..., title="Text", description="Text of phrase", max_length=200) #  .   - 200 . class PhraseOutput(PhraseInput): id: typing.Optional[int] = None # ID     . 

Erstellen Sie anschließend eine einfache Klasse für die Arbeit mit der Datenbank:


 class Database: """ Our **fake** database. """ def __init__(self): self._items: typing.Dict[int, PhraseOutput] = {} # id: model def get_random(self) -> int: #    return random.choice(self._items.keys()) def get(self, id: int) -> typing.Optional[PhraseOutput]: #    ID return self._items.get(id) def add(self, phrase: PhraseInput) -> PhraseOutput: #   id = len(self._items) + 1 phrase_out = PhraseOutput(id=id, **phrase.dict()) self._items[phrase_out.id] = phrase_out return phrase_out def delete(self, id: int) -> typing.Union[typing.NoReturn, None]: #   if id in self._items: del self._items[id] else: raise ValueError("Phrase doesn't exist") 

Jetzt können Sie die API selbst schreiben.


API


Erstellen Sie die Datei main.py und importieren Sie die folgenden Module:


 from fastapi import FastAPI from fastapi import HTTPException from db import PhraseInput from db import PhraseOutput from db import Database 

Wir initialisieren unsere Anwendung und Datenbank:


 app = FastAPI(title="Random phrase") db = Database() 

Und schreiben Sie eine einfache Methode, um eine zufällige Phrase zu erhalten!


 @app.get( "/get", response_description="Random phrase", description="Get random phrase from database", response_model=PhraseOutput, ) async def get(): try: phrase = db.get(db.get_random()) except IndexError: raise HTTPException(404, "Phrase list is empty") return phrase 

Wie Sie sehen, gebe ich im Dekorateur auch einige andere Werte an, die für eine schönere Dokumentation erforderlich sind :) In der offiziellen Dokumentation können Sie sich alle möglichen Parameter ansehen.


In diesem Codeteil wird versucht, einen zufälligen Ausdruck aus der Datenbank abzurufen. Wenn die Datenbank leer ist, wird ein Fehler mit Code 404 zurückgegeben.


Ebenso schreiben wir andere Methoden:


 @app.post( "/add", response_description="Added phrase with *id* parameter", response_model=PhraseOutput, ) async def add(phrase: PhraseInput): phrase_out = db.add(phrase) return phrase_out @app.delete("/delete", response_description="Result of deleting") async def delete(id: int): try: db.delete(id) except ValueError as e: raise HTTPException(404, str(e)) 

Und alle! Unsere kleine, aber nützliche API ist fertig!


Jetzt können wir die Anwendung mit uvicorn starten , die Online-Dokumentation ( http://127.0.0.1/docs ) öffnen und unsere API testen !



Nützliche Materialien


Natürlich konnte ich Ihnen nicht alle Funktionen von FastAPI erläutern, wie zum Beispiel: intelligentes DI-System, Middleware, Cookies, Standardauthentifizierungsmethoden in der API (jwt, oauth2, api-key) und vieles mehr!


Der Zweck dieses Artikels ist jedoch nicht so sehr eine Übersicht über alle Funktionen dieses Frameworks, sondern vielmehr, wie sehr Sie gezwungen sind, es selbst zu erkunden. FastAPI hat eine großartige Dokumentation mit Tonnen von Beispielen.


Code aus einem Artikel über Github
Offizielle Dokumentation
Github-Repository


PS


cryo8822 hat den Artikel ins Englische übersetzt, danke! .

Source: https://habr.com/ru/post/de478620/


All Articles