¿Por qué deberías probar FastAPI?

imagen El logotipo está tomado del repositorio Github FastAPI


FastAPI es un marco web relativamente nuevo escrito en el lenguaje de programación Python para crear API REST (y, si lo intentas mucho, GraphQL) basada en nuevas características de Python 3.6+, como: sugerencias de tipo, asincronía nativa (asyncio ) Entre otras cosas, FastAPI se integra estrechamente con el esquema OpenAPI y genera automáticamente documentación para su API a través de Swagger y ReDoc


FastAPI se basa en Starlette y Pydantic .
Starlette es un micro-marco ASGI para escribir aplicaciones web.
Pydantic : una biblioteca para analizar y validar datos basados ​​en sugerencias de tipo Python.


¿Qué dicen sobre FastAPI?


"[...] uso FastAPI con mucha frecuencia en los últimos días. [...] Definitivamente planeo usarlo para todos los servicios de ML de mi equipo en Microsoft. Algunos de ellos se integran en Windows y algunos productos de Office".

Kabir Khan - Microsoft ( ref )


"Si desea aprender otro marco para escribir una API REST, eche un vistazo a FastAPI [...] Es rápido, fácil de usar y aprender". [...] "

"Ahora usamos FastAPI para nuestras API [...] ¡Creo que te gustará! [...]"

Ines Montani - Matthew Honnibal - Fundadores de Explosion AI - creadores de spaCy ( ref ) - ( ref )


API mínima creada con FastAPI


Trataré de mostrarle cómo crear una API simple, pero al mismo tiempo útil, con documentación para desarrolladores. ¡Escribiremos un generador de frases al azar!


Instalar requisitos previos


pip install wheel -U pip install uvicorn fastapi pydantic 

Nuevo módulo!
Uvicorn es un servidor web compatible con ASGI que usaremos para ejecutar nuestra aplicación.


Primero, crearemos la base de nuestra aplicación.


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

Esta aplicación ya se está ejecutando y se puede iniciar.
Escriba este comando en su terminal y abra la página en el navegador en http://127.0.0.1:8000/docs .


 uvicorn <__>:app 

Pero mientras que en nuestra aplicación no se indica un único punto final, ¡solucionémoslo!


Base de datos


Como estamos escribiendo un generador de frases al azar, obviamente necesitamos almacenarlos en algún lugar. Para esto, elegí un simple python-dict .


Cree un archivo db.py y comience a escribir código.


Importamos los módulos necesarios:


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

Después, designamos dos modelos: la frase de entrada (la que nos enviará el usuario) y la "salida" (la que le enviaremos al usuario).


 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     . 

Después de eso, cree una clase simple para trabajar con la base de datos:


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

Ahora puede comenzar a escribir la API en sí.


API


Cree el archivo main.py e importe los siguientes módulos:


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

Inicializamos nuestra aplicación y base de datos:


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

¡Y escriba un método simple para obtener una frase aleatoria!


 @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 

Como puede ver, en el decorador también indico algunos otros valores necesarios para generar documentación más bella :) En la documentación oficial puede ver todos los parámetros posibles.


En este fragmento de código, estamos tratando de obtener una frase aleatoria de la base de datos, y si la base de datos está vacía, devolvemos un error con el código 404.


Del mismo modo, escribimos otros métodos:


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

¡Y eso es todo! ¡Nuestra pequeña pero útil API está lista!


¡Ahora podemos iniciar la aplicación usando uvicorn , abrir la documentación en línea ( http://127.0.0.1/docs ) y probar nuestra API!



Materiales utiles


Por supuesto, no podría contarle todas las características de FastAPI, por ejemplo, como: sistema DI inteligente, middlewares, cookies, métodos de autenticación estándar en la API (jwt, oauth2, api-key) y mucho más.


Pero el propósito de este artículo no es tanto una descripción general de todas las características de este marco, sino cuánto empujarlo a explorarlo usted mismo. FastAPI tiene una excelente documentación con toneladas de ejemplos.


Código de un artículo sobre Github
Documentación oficial
Repositorio de Github


PS


cryo8822 hizo una traducción del artículo al inglés, ¡gracias! .

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


All Articles