Pourquoi devriez-vous essayer FastAPI?

image Le logo est extrait du référentiel Github FastAPI


FastAPI est un framework Web relativement nouveau écrit dans le langage de programmation Python pour créer l'API REST (et, si vous essayez dur, puis GraphQL) basé sur de nouvelles fonctionnalités Python 3.6+, telles que: conseils de type, asynchronie native (asyncio ) Entre autres choses, FastAPI s'intègre étroitement avec le schéma OpenAPI et génère automatiquement la documentation de votre API via Swagger et ReDoc


FastAPI est basé sur Starlette et Pydantic .
Starlette est un micro-framework ASGI pour l'écriture d'applications web.
Pydantic - une bibliothèque pour analyser et valider des données basées sur des indices de type Python.


Que disent-ils de FastAPI?


"[...] J'utilise FastAPI très souvent ces derniers jours. [...] Je prévois certainement de l'utiliser pour tous les services ML de mon équipe chez Microsoft. Certains d'entre eux s'intègrent dans Windows et certains produits Office."

Kabir Khan - Microsoft ( réf )


"Si vous voulez apprendre un autre framework pour écrire une API REST, jetez un œil à FastAPI [...] Il est rapide, facile à utiliser et à apprendre. [...]"

"Maintenant, nous utilisons FastAPI pour nos API [...] je pense que vous l'aimerez! [...]"

Ines Montani - Matthew Honnibal - Fondateurs d' Explosion AI - créateurs de spaCy ( ref ) - ( ref )


API minimale créée à l'aide de FastAPI


Je vais essayer de vous montrer comment créer une API simple mais en même temps utile avec de la documentation pour les développeurs. Nous allons écrire un générateur de phrases aléatoires!


Installation des prérequis


pip install wheel -U pip install uvicorn fastapi pydantic 

Nouveau module!
Uvicorn est un serveur Web compatible ASGI que nous utiliserons pour exécuter notre application.


Tout d'abord, nous allons créer la base de notre application.


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

Cette application est déjà en cours d'exécution et peut être démarrée.
Écrivez cette commande dans votre terminal et ouvrez la page dans le navigateur à http://127.0.0.1:8000/docs .


 uvicorn <__>:app 

Mais alors que dans notre application, aucun point final n'est indiqué - corrigeons-le!


Base de données


Puisque nous écrivons un générateur de phrases aléatoires, nous devons évidemment les stocker quelque part. Pour cela, j'ai choisi un simple python-dict .


Créez un fichier db.py et commencez à écrire du code.


Nous importons les modules nécessaires:


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

Après - nous désignons deux modèles: la phrase d'entrée (celle que l'utilisateur nous enverra) et la «sortie» (celle que nous enverrons à l'utilisateur).


 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     . 

Après cela, créez une classe simple pour travailler avec la base de données:


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

Vous pouvez maintenant commencer à écrire l'API elle-même.


API


Créez le fichier main.py et importez les modules suivants:


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

Nous initialisons notre application et notre base de données:


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

Et écrivez une méthode simple pour obtenir une phrase aléatoire!


 @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 

Comme vous pouvez le voir, dans le décorateur, j'indique également d'autres valeurs nécessaires pour générer une documentation plus belle :) Dans la documentation officielle, vous pouvez regarder tous les paramètres possibles.


Dans ce morceau de code, nous essayons d'obtenir une phrase aléatoire de la base de données, et si la base de données est vide, nous renvoyons une erreur avec le code 404.


De même, nous écrivons d'autres méthodes:


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

Et c'est tout! Notre petite mais utile API est terminée!


Nous pouvons maintenant lancer l'application en utilisant uvicorn , ouvrir la documentation en ligne ( http://127.0.0.1/docs ) et essayer notre API!



Matériaux utiles


Bien sûr, je ne pouvais pas vous parler de toutes les fonctionnalités de FastAPI, par exemple, telles que: système DI intelligent, middlewares, cookies, méthodes d'authentification standard dans l'API (jwt, oauth2, api-key) et bien plus encore!


Mais le but de cet article n'est pas tant un aperçu de toutes les fonctionnalités de ce cadre, mais combien vous pousse à l'explorer vous-même. FastAPI a une excellente documentation avec des tonnes d'exemples.


Code d'un article sur Github
Documentation officielle
Dépôt Github


PS


cryo8822 a fait une traduction de l'article en anglais, merci! .

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


All Articles