Fase 3. Desarrollo de la Aplicación
En esta fase, vamos a estructurar cómo se desarrollarán los distintos módulos del sistema, tanto en el backend como en el frontend, para implementar las funcionalidades esenciales del proyecto.
1. Desarrollo del Backend (Django con Django REST Framework)
A. Configuración Inicial del Proyecto
1 Instalación de Dependencias: Instalaremos las dependencias necesarias en el entorno virtual de Python.
pip install django djangorestframework psycopg2-binary django-environ djangorestframework-jwt redis
Configuración del Proyecto Django:
- Crear el proyecto Django con el comando:
django-admin startproject backend .
- Crear las aplicaciones para autenticación, productos y pedidos:
python manage.py startapp auth
python manage.py startapp products
python manage.py startapp orders
- Configuración de la Base de Datos:
- En el archivo settings.py, configura la conexión a PostgreSQL utilizando el paquete django-environ para gestionar variables de entorno. Asegúrate de tener un archivo .env con las credenciales necesarias:
= {
DATABASES 'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('DB_NAME'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST': os.environ.get('DB_HOST'),
'PORT': os.environ.get('DB_PORT', 5432),
} }
Y en el archivo .env, agrega las variables de entorno:
DB_NAME=mydatabase
DB_USER=myuser
DB_PASSWORD=mypassword
DB_HOST=localhost
DB_PORT=5432
B. Implementación de Modelos
Modelo de Usuario:
- En el archivo auth/models.py, crea un modelo de usuario si decides personalizarlo (si no, puedes usar el modelo User por defecto de Django).
Modelo de Producto:
- En products/models.py, define el modelo para los productos con campos como nombre, precio, inventario, imagen, etc.
class Producto(models.Model):
= models.CharField(max_length=255)
nombre = models.DecimalField(max_digits=10, decimal_places=2)
precio = models.TextField()
descripcion = models.IntegerField()
inventario = models.ImageField(upload_to='productos/') imagen
- Modelo de Pedido:
En orders/models.py, crea un modelo para los pedidos, con campos como usuario, productos, fecha, estado, etc.
class Pedido(models.Model):
= models.ForeignKey(User, on_delete=models.CASCADE)
usuario = models.ManyToManyField(Producto)
productos = models.DateTimeField(auto_now_add=True)
fecha = models.CharField(max_length=50)
estado = models.DecimalField(max_digits=10, decimal_places=2) total
C. Serializadores
En el backend, usarás serializers para transformar los datos entre los modelos y las respuestas JSON:
- Serializador de Producto (en products/serializers.py):
from rest_framework import serializers
from .models import Producto
class ProductoSerializer(serializers.ModelSerializer):
class Meta:
= Producto
model = ['id', 'nombre', 'precio', 'descripcion', 'inventario', 'imagen'] fields
- Serializador de Pedido (en orders/serializers.py):
from rest_framework import serializers
from .models import Pedido
from products.serializers import ProductoSerializer
class PedidoSerializer(serializers.ModelSerializer):
= ProductoSerializer(many=True)
productos
class Meta:
= Pedido
model = ['id', 'usuario', 'productos', 'fecha', 'estado', 'total'] fields
D. Vistas y Rutas
- Vistas para el Producto (en products/views.py):
from rest_framework import viewsets
from .models import Producto
from .serializers import ProductoSerializer
class ProductoViewSet(viewsets.ModelViewSet):
= Producto.objects.all()
queryset = ProductoSerializer serializer_class
- Vistas para el Pedido (en orders/views.py):
from rest_framework import viewsets
from .models import Pedido
from .serializers import PedidoSerializer
class PedidoViewSet(viewsets.ModelViewSet):
= Pedido.objects.all()
queryset = PedidoSerializer serializer_class
- Rutas (en urls.py):
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from products.views import ProductoViewSet
from orders.views import PedidoViewSet
= DefaultRouter()
router r'productos', ProductoViewSet)
router.register(r'pedidos', PedidoViewSet)
router.register(
= [
urlpatterns 'api/', include(router.urls)),
path( ]
E. Autenticación (JWT)
- Configuración de JWT:
- Instala el paquete djangorestframework-jwt para la autenticación con JWT.
pip install djangorestframework-jwt
- En settings.py, agrega la configuración para JWT:
= {
REST_FRAMEWORK 'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
], }
- Vistas de Login/Logout:
- Crea vistas para manejar el login y logout de los usuarios, utilizando JWT.
2. Desarrollo del Frontend (React con Vite)
A. Configuración Inicial del Proyecto
- Crear el Proyecto React con Vite:
npm create vite@latest frontend --template react
cd frontend
npm install
- Instalar Dependencias:
npm install axios react-router-dom
B. Estructura de Archivos
En el frontend, la estructura del proyecto será la siguiente:
frontend/
├── src/
│ ├── components/
│ │ ├── Header.js
│ │ └── ProductList.js
│ ├── pages/
│ │ ├── HomePage.js
│ │ └── ProductPage.js
│ ├── services/
│ │ └── api.js
│ ├── App.js
│ ├── index.js
│ └── store/
├── public/
├── tailwind.config.js
├── vite.config.js
└── .env
C. Lógica de Peticiones con Axios
- Servicio API (en services/api.js):
import axios from 'axios';
const API_URL = 'http://localhost:8000/api/';
export const getProductos = async () => {
const response = await axios.get(`${API_URL}productos/`);
return response.data;
;
}
export const getPedido = async (id) => {
const response = await axios.get(`${API_URL}pedidos/${id}/`);
return response.data;
; }
- Componente de Lista de Productos (en components/ProductList.js):
import React, { useEffect, useState } from 'react';
import { getProductos } from '../services/api';
const ProductList = () => {
const [productos, setProductos] = useState([]);
useEffect(() => {
const fetchProductos = async () => {
const data = await getProductos();
setProductos(data);
;
}
fetchProductos();
, []);
}
return (
<div>
<h2>Productos</h2>
<ul>
.map((producto) => (
{productos<li key={producto.id}>{producto.nombre}</li>
))}</ul>
</div>
;
);
}
export default ProductList;
3. Despliegue y Configuración de Docker
A. Configuración de Docker
- Dockerfile para el Backend:
# Dockerfile para Backend
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
- Dockerfile para el Frontend:
# Dockerfile para Frontend
FROM node:16
WORKDIR /app
COPY package.json .
COPY package-lock.json .
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
- docker-compose.yml:
services:
backend:
build: ./backend
ports:
- "8000:8000"
depends_on:
- db
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase