Auxiliar 3 - Interfaz (React + FastAPI)
Universidad de Chile Facultad de Ciencias Físicas y Matemáticas Departamento de Ciencias de la computacion CC5326 – Diseño de Internet de las Cosas
Profesor: Luciano Radrigan F. Auxiliar: Alberto Abarzua P.
Objetivos a cumplir
- Creacion del proyecto (React + FastAPI)
- Como agregar un endpoint
- Como crear un componente
- Como usar un componente con un endpoint
Creacion del proyecto (React + FastAPI)
Esta parte es unicamente para que sepan que se hizo para generar la siguiente plantilla (La misma de la tarea 3)
En esta plantilla tenemos:
- Un proyecto de React usando Vite
- Un proyecto de FastAPI
Para generar esta plantilla se siguieron los siguientes pasos:
Depenedencias
Para esto hay dos rutas, usando solo docker (lo que se hizo aqui) o usando las instalaciones locales de node y python.
A modo de resumen, las dependencias son:
- Node
- Python
- Docker Desktop
Creacion del proyecto de React
Para esto se siguieron los siguientes pasos:
Crear el proyecto de React
npm create vite@latest nombre_del_proyecto --template react
Esto nos genera un proyecto de React usando Vite como bundler.
Luego a este proyecto de react se le agrego tailwindcss, para esto se siguieron los siguientes pasos:
Para la creacion del proyecto de FastAPI se siguieron los siguientes pasos:
pip install fastapi
pip install uvicorn
Luego lo basico para tener un proyecto funcional de fastapi es:
from fastapi import FastAPI
app = FastAPI()
@app.get("/ejemplo/")
async def get_items():
return {"message": "Hello World"}
Como agregar un endpoint
Para agregar un endpoint a FastAPI se debe de agregar una funcion con el decorador @app.get
o @app.post
dependiendo del metodo que se quiera usar.
from fastapi import FastAPI
app = FastAPI()
@app.get("/ejemplo/")
async def get_items():
return {"message": "Hello World"}
Aqui se agrega un endpoint en la ruta /ejemplo/
que retorna un json con el mensaje Hello World
.
Los endpoints tipo get
se usan para obtener informacion, mientras que los endpoints tipo post
se usan para enviar informacion.
Para la creacion de un endpoint tipo post
se debe de usar el decorador @app.post
y se debe de definir un modelo unsando BaseModel
de pydantic.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
async def create_item(item: Item):
name = item.name
price = item.price
if item.is_offer:
price = price - 1
return item
En este caso se agrega un endpoint en la ruta /items/
que recibe un json con los campos name
, price
y is_offer
y retorna el mismo json.
Como crear un componente
Para crear un componente en React se debe de crear un archivo con la extension .jsx
o .tsx
en la carpeta src/components/
.
Por ejemplo, para crear un componente llamado Ejemplo
se debe de crear el archivo src/components/Ejemplo.jsx
con el siguiente contenido:
const Ejemplo = () => {
return (
<div>
<h1>Ejemplo</h1>
</div>
);
};
export default Ejemplo;
Como pueden ver un componente es una funcion que retorna un elemento JSX. (JSX es una extension de javascript que permite escribir codigo html dentro de javascript)
Para usar este componente en otro componente se debe de importar y usar como si fuera una etiqueta html.
import Ejemplo from "../components/Ejemplo";
const App = () => {
return (
<div>
<Ejemplo />
</div>
);
};
Como usar un componente con un endpoint
Para por ejemplo crear un componente el cual en su renderizado haga una peticion a un endpoint se debe de usar el hook useEffect
de React.
Para realizar peticiones a un endpoint usaremos la libreria axios
.
# Asi se instala axios, en la plantilla ya esta instalado
npm install axios
Para usar axios se debe de importar y usar de la siguiente manera:
import axios from "axios";
import { useEffect } from "react";
const Ejemplo = () => {
useEffect(() => {
const get = async () => {
const response = await axios.get("http://localhost:8000/ejemplo/");
console.log(response.data);
};
});
}, []);
return (
<div>
<h1>Ejemplo</h1>
</div>
);
};
En otros casos tal vez queremos que se llame algun endpoint cuando se haga click en algun boton, para esto se puede usar el hook useState
de React.
import axios from "axios";
import { useEffect, useState } from "react";
const Ejemplo = () => {
const [data, setData] = useState(null);
useEffect(() => {
const get = async () => {
const response = await axios.get("http://localhost:8000/ejemplo/");
setData(response.data);
};
});
}, []);
return (
<div>
<h1>Ejemplo</h1>
<button onClick={get}>Get</button>
<p>{data}</p>
</div>
);
};
Actividad
Crear un enpoint que reciba el metodo post y get, este se debe tener la ruta ‘/config/’ y debe de recibir un json con los campos ‘ssid’ y ‘password’ y debe de retornar el mismo json.
Crear un componente que tenga un input para el ssid y otro para el password, ademas de un boton que al hacer click haga una peticion post al endpoint creado en el punto 1.
Crear un componente que tenga un boton que al hacer click haga una peticion get al endpoint creado en el punto 1 y muestre el resultado en un parrafo.
Notas :
Para el input pueden usar la libreria react-hook-form
para facilitar el manejo de formularios.