agustinawarenycia /
proyecto_final_codo_a_codo
Proyecto web simple de html y CSS para el curso Python Fullstack
Loading repository data…
maxisimonazzi / repository
Proyecto Fullstack para Codo a Codo 2024 1er cuatrimestre, comisiones 24148 y 24181. Contiene el mini frontend de ejemplo y backend Flask con api para su consumo.
Tabla de contenido
GET /productos (Lista todos los productos cargados y sus propiedades)GET /productos/<int:codigo> (Muestra las propiedades del producto seleccionado)POST /productos (Agrega un producto a la lista)PUT /productos/<int:codigo> (Modifica el producto seleccionado)DELETE /productos/<int:codigo> (Elimina el producto seleccionado)El proyecto se trata de un sistema que permite administrar una base de datos de productos, implementado una API en Python utilizando el framework Flask. Las operaciones que se realizarán en este proyecto es dar de alta, modificar, eliminar y listar los productos, operaciones que podrán hacer los usuarios a través de una página Web.
Como ejemplo trabajaremos con una empresa de venta de artículos de computación que ofrece sus productos a través de una Web.
Aquí hay un resumen de las principales características y funcionalidades del proyecto:
Gestión de productos:
Persistencia de datos:
Se implementan desde cero el backend y el frontend. En el caso del backend, el proyecto va "evolucionando", comenzando en el desarrollo de las funciones que se necesitan para manipular los productos utilizando arreglos en memoria, luego se modifica para utilizar objetos, más tarde se gestiona la persistencia de los datos utilizando una base de datos SQL, se aloja el script Python en un servidor, y por último se crea un frontend básico para interactuar con los datos desde el navegador, a través de la API creada. Para este primer proyecto de BackEnd no vamos a utilizar entornos virtuales de ningun tipo ya que el proposito es solo entender los conceptos.
El proyecto se divide en seis etapas:
Para clonar este repo localmente, ejecuta en la terminal el siguiente comando.
git clone https://github.com/maxisimonazzi/proyecto-fullstack-codo2024-1ercuatrimestre.git
Si queres replicar este repo en tu cuenta de github podes hacer un fork al proyecto o sino crear un nuevo repo en tu perfil y luego agregar los archivos de tu repo local.
#En tu repo local
git init
git add .
git commit -m "primer commit"
git branch -M main
git remote add origin https://github.com/{tu_usuario}/tu_repo.git
git push -u origin main
La app hace uso del archivo datosconexion.py para obtener las variables de conexion a la base de datos y la API de PythonAnywhere. En el repo vas a encontrar el archivo datosconexion-template.py que tiene la siguiente estructura
# Datos de acceso a la Base de Datos
host='host'
user='user'
password='pass'
database='database'
# Credenciales API PythonAnywhere
username = "xxxxxxx"
api_token = "api_token"
domain_name = "xxxxxxx.pythonanywhere.com"
Reemplazar los datos para conectar con la base de datos segun corresponda, de igual manera los datos de la API Key (si se utiliza) y renombrar el archivo a datosconexion.py para que pueda ser importado correctamente por la app.
Para obtener los datos de acceso a la Base de datos en PythonAnywhere nos dirigimos a la seccion Database
Para obtener la API Key en PythonAnywhere
Explicaremos el funcionamiento dividido en dos partes, el FrontEnd y el BackEnd.
El archivo app.py contiene todo el backend sin modularizar. Lo primero que hay que hacer es especificar la ruta correcta donde seran guardadas las imagenes
ruta_destino = './static/imagenes/'
Esta debe ser cambiada por la ruta a utilizar en PythonAnywhere, que sera del tipo:
ruta_destino = '/home/{tu_usuario}/mysite/static/imagenes/'
Una vez realizado este cambio, podemos ver los metodos de la clase Catalogo como asi tambien los endpoints definidos en Flask.
La URL base para tu API sera la que te entregue PythonAnywhere y dependera de tu nombre de usuario:
https://{tu_usuario}.pythonanywhere.com/
GET /productos (Lista todos los productos cargados y sus propiedades)Ninguno
Código HTTP content-type Respuesta 200 application/json JSON
curl -X GET -H "Content-Type: application/json" https://{tu_usuario}.pythonanywhere.com/productos
GET /productos/<int:codigo> (Muestra las propiedades del producto seleccionado)Ninguno
Código HTTP content-type Respuesta 200 application/json JSON 404 application/json JSON
curl -X GET -H "Content-Type: application/json" https://{tu_usuario}.pythonanywhere.com/productos/1
POST /productos (Agrega un producto a la lista)
Nombre Tipo Tipo de dato Descripción descripcion requerido string Descripcion del producto cantidad requerido int Cantidad del producto a agregar precio requerido float Precio del producto a agregar proveedor requerido int Codigo del proveedor del producto a agregar imagen requerido file Imagen del producto a agregar
Código HTTP content-type Respuesta 201 application/json JSON 400 text/html; charset=utf-8 None 500 application/json JSON
curl -X POST -H 'Content-Type: multipart/form-data' -F 'descripcion=Descripción del producto' -F 'cantidad=5' -F 'precio=10000' -F 'proveedor=123' -F imagen=@./static/imagenes/img.jpg https://{tu_usuario}.pythonanywhere.com/productos
PUT /productos/<int:codigo> (Modifica el producto seleccionado)
Nombre Tipo Tipo de dato Descripción descripcion requerido string Descripcion del producto cantidad requerido int Cantidad del producto a agregar precio requerido float Precio del producto a agregar proveedor requerido int Codigo del proveedor del producto a agregar imagen requerido file Imagen del producto a agregar
Código HTTP content-type Respuesta 200 application/json JSON 404 application/json JSON
curl -X PUT -H 'Content-Type: multipart/form-data' -F 'descripcion=Descripción del producto' -F 'cantidad=5' -F 'precio=10000' -F 'proveedor=123' -F imagen=@./static/imagenes/img.jpg https://{tu_usuario}.pythonanywhere.com/productos
DELETE /productos/<int:codigo> (Elimina el producto seleccionado)Ninguno
Código HTTP content-type Respuesta 200 application/json JSON 404 application/json JSON
curl -X DELETE -H "Content-Type: application/json" https://{tu_usuario}.pythonanywhere.com/productos/1
Por cuestionas meramente pedagogicas, en el archivo app.py se abre una conexion a la Base de datos para luego ejecutar todas las consultas necesarias. Esta conexion no se cierra nunca, y como es de esperarse, el motor de Base de datos cierra automaticamente la conexion luego de un tiempo de inactividad, por lo que la app devuelve un error cuando intenta consultar la base de datos.
Para sobrellevar esto, implementamos la alternativa de abrir una conexion antes de ejecutar cualquier consulta y cerrarla luego de terminarla, de esta manera, las conexiones son efimeras y solo se conectara cuando se necesite hacer una consulta. Esto lo tenemos resuelto dentro del archivo app_closingconnection.py.
Alli veremos que la clase Catalogo tiene dos metodos nuevos, uno llamado conectar y otro llamado desconectar. El primero abre una conexion a la Base de datos y el segundo cierra la conexion a la Base de datos. Al momento de ejecutar una consulta, primero llamamos al metodo de conectar y luego al metodo desconectar.
Muchas veces, la app alojada en PythonAnywhere deja de responder, ya sea por una limitacion de los recursos gratuitos o por que no se usa la implementacion de cerrar la conexion a la base de datos. En esas situaciones la pagina debe recargarse en PythonAnywhere haciendo click en el boton Reload. Esto implica tener que dirigirnos a la pagina, loguearnos y luego buscar el boton reload de
Selected from shared topics, language and repository description—not editorial ratings.
agustinawarenycia /
Proyecto web simple de html y CSS para el curso Python Fullstack
Proyecto final para certificación de Bootcamp FullStack
ManuxDev92 /
Proyecto fullstack de gestión de usuarios: backend en Node.js + MongoDB con login seguro (JWT/bcrypt) y frontend simple en HTML/JS para consumir la API.
EstebanOrduna /
Proyecto para la materia de Desarrollo web fullstack
JenniferChB /
Proyecto de Html, Css y Js para el diplomado web fullstack de la ibero
lrdisanto /
Proyecto puramente HTML y CSS para curso Fullstack Python