Apuntes: Heroku - Python - FastApi
En este post supone que se usa Heroku CLI.
Contenido
-
Archivo de configuración requirements.txt para FastApi en Heroku
-
En una ruta POST recibir un json en el request y convertirlo a un diccionario
Renombrar un remoto
Renombrar el remoto de heroku
a heroku-staging
git remote rename heroku heroku-staging
Fuente: devcenter.heroku.com/articles — Rename a Remote
Realizar el deploy de una subcarpeta
Logearse a heroku con heroku login
.
Agregar el remoto si no esta agreagdo heroku git:remote -a my-app
.
Pushear la subcarpeta
git subtree push --prefix NOMBRE_SUBCARPETA heroku master
donde:
heroku
es el nombre del remoto. Para listar el nombre de todos los remotos el proyecto se puede usar la instrucción.
git remote -v
Fuente: janessagarrow.com — How to Deploy a Subdirectory to Heroku
Archivo de configuración Procfile para FastApi en Heroku
Se necesita un archivo de configuración llamado Procfile
que no lleva extención de archivo.
Su contenido se muestra a continuación.
======= Procfile =======
web: uvicorn main:app --host=0.0.0.0 --port=${PORT:-5000}
donde:
main
es el nombre del archivo principal de tu proyecto de FastApi.app
es el nombre de la variable de FastApi enmain
(app = FastAPI()
).
Fuente: youtube.com — Desplegando (Deploy) una aplicación FastAPI en Heroku.
Archivo de configuración requirements.txt para FastApi en Heroku
Heroku reconocerá que la app es de Python si incluye un archivo requirements.txt
en el directorio raíz del proyecto.
El archivo requirements.txt
contiene una lista de elementos que se instalarán usando
pip install -r requirements.txt
Una manera rápida de crear este archivo es con la instrucción
pip freeze > requirements.txt
Como consejo personal, si es un proyecto pequeño que incluye tensorflow en conveniente usar la versión cpu para no rebasar el limite de 500MB que brinda Heroku en su plan gratuito. Un ejemplo se muestra a continuación.
======= requirements.txt =======
fastapi==0.66.1
uvicorn==0.14.0
tensorflow-cpu==2.5.0
Fuentes:
requirements.txt
en Heroku: devcenter.heroku.com/articles — Recognizing a Python app
Información sobre requirements.txt
: pip.pypa.io — Requirements Files
Correr 2 apis en diferentes puertos en local
Si hay dos archivos de python llamados api.py
y api2.py
para correrlos en diferentes puertos en local se hace con
uvicorn api:app --host 127.0.0.1 --port 4000 --reload
uvicorn api2:app --host 127.0.0.1 --port 2000 --reload
Eliminar las rutas docs y redoc en FastAPI
Es buena idea eliminar las rutas /docs
y /redoc
cuando el proyecto pasa a producción.
Estas rutas se eliminan con app = FastAPI(docs_url=None, redoc_url=None)
, un mejor ejemplo se muestra a continuación.
from fastapi import FastAPI
app = FastAPI(docs_url=None, redoc_url=None)
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
fuente: fastapi.tiangolo.com/tutorial — Docs URLs
En una ruta POST recibir un json en el request y convertirlo a un diccionario
from fastapi import FastAPI, Body
app = FastAPI()
@app.post("/post_path")
async def post_path(request: dict = Body(...)):
data = request
return data
En data
se encuentra el request convertido a diccionario.
Si, la parte de código request: dict = Body(...)
se pone tal cual.
Fuente: stackoverflow.com/questions/64379089/ — FastAPI: how to read body as any valid json?