Fase 4: Integración de Funcionalidades Avanzadas
En esta fase, vamos a agregar características avanzadas para hacer que el sistema sea más funcional y completo, incluyendo autenticación JWT, integración con pasarelas de pago (como PayPal), y optimización del flujo de trabajo para los usuarios.
1. Implementación de la Autenticación de Usuarios con JWT
A. Configuración de la Autenticación JWT en el Backend
- Configuración del paquete SimpleJWT: Instala la biblioteca necesaria si aún no lo has hecho:
pip install djangorestframework-simplejwt
Luego, actualiza settings.py para incluir la configuración de autenticación JWT:
= {
REST_FRAMEWORK 'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
], }
- Vistas para Autenticación (Login y Refresh Tokens): En el archivo auth/views.py, crea las vistas para manejar tokens de acceso y refresco:
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
from django.urls import path
= [
urlpatterns 'login/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path( ]
- Protección de las Rutas API: Asegúrate de que las vistas relacionadas con productos y pedidos estén protegidas mediante JWT:
from rest_framework.permissions import IsAuthenticated
class ProductoViewSet(viewsets.ModelViewSet):
= Producto.objects.all()
queryset = ProductoSerializer
serializer_class = [IsAuthenticated] permission_classes
- Pruebas para la Autenticación: Agrega pruebas en el backend para validar que solo los usuarios autenticados puedan acceder a las rutas protegidas.
B. Configuración del Frontend para JWT
- Manejo del Login en el Frontend: Crea un componente Login.js para autenticar al usuario:
import React, { useState } from 'react';
import axios from 'axios';
const Login = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const handleSubmit = async (e) => {
.preventDefault();
etry {
const response = await axios.post('http://localhost:8000/api/login/', {
username: email,
password: password,
;
}).setItem('access', response.data.access);
localStorage.setItem('refresh', response.data.refresh);
localStoragealert('Inicio de sesión exitoso');
catch (error) {
} console.error('Error al iniciar sesión:', error);
alert('Credenciales incorrectas');
};
}
return (
<form onSubmit={handleSubmit}>
<input
="email"
type={email}
value={(e) => setEmail(e.target.value)}
onChange="Correo electrónico"
placeholder/>
<input
="password"
type={password}
value={(e) => setPassword(e.target.value)}
onChange="Contraseña"
placeholder/>
<button type="submit">Iniciar sesión</button>
</form>
;
);
}
export default Login;
- Autenticación Automática en Axios: Configura un interceptor en Axios para agregar automáticamente el token JWT a las solicitudes:
import axios from 'axios';
const API = axios.create({
baseURL: 'http://localhost:8000/api/',
;
})
.interceptors.request.use((config) => {
APIconst token = localStorage.getItem('access');
if (token) {
.headers.Authorization = `Bearer ${token}`;
config
}return config;
;
})
export default API;
2. Integración con PayPal
A. Configuración del SDK de PayPal
- Instalar el SDK en el Frontend: Instala el paquete de PayPal:
npm install @paypal/react-paypal-js
- Configurar el Componente de Pago: Crea un componente PaypalButton.js que permita realizar pagos:
import React from 'react';
import { PayPalScriptProvider, PayPalButtons } from '@paypal/react-paypal-js';
const PaypalButton = ({ total }) => {
const handleApprove = (data, actions) => {
return actions.order.capture().then((details) => {
alert(`Pago realizado por ${details.payer.name.given_name}`);
;
});
}
return (
<PayPalScriptProvider
={{ "client-id": "YOUR_PAYPAL_CLIENT_ID" }}
options>
<PayPalButtons
={(data, actions) => {
createOrderreturn actions.order.create({
purchase_units: [
{amount: {
value: total.toString(),
,
},
},
];
})
}}={handleApprove}
onApprove/>
</PayPalScriptProvider>
;
);
}
export default PaypalButton;
- Actualizar la Página de Pedido: Integra el botón de PayPal en la página de resumen del pedido (OrderPage.js):
import React from 'react';
import PaypalButton from '../components/PaypalButton';
const OrderPage = ({ order }) => {
return (
<div>
<h2>Resumen del Pedido</h2>
<ul>
.productos.map((producto) => (
{order<li key={producto.id}>
.nombre} - ${producto.precio}
{producto</li>
))}</ul>
<h3>Total: ${order.total}</h3>
<PaypalButton total={order.total} />
</div>
;
);
}
export default OrderPage;
3. Optimización de Flujo de Trabajo
A. Validaciones en Formularios
- Implementa validaciones en el frontend (con herramientas como Formik o React Hook Form) para asegurar que los formularios contengan datos correctos antes de enviarse.
B. Paginación en Listas de Productos
- Implementa la paginación en el backend utilizando LimitOffsetPagination:
from rest_framework.pagination import LimitOffsetPagination
class ProductoPagination(LimitOffsetPagination):
= 10
default_limit = 100 max_limit
- Configura la paginación en el frontend con estados que gestionen el desplazamiento entre páginas.
C. Optimización con Caching
- Configura un sistema de caching en el backend utilizando Redis para mejorar el rendimiento de las solicitudes frecuentes.
pip install django-redis
En settings.py:
= {
CACHES 'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
} }
D. Dockerización Completa
- Asegúrate de que tanto el backend como el frontend estén correctamente empaquetados con sus dependencias para el despliegue. Puedes agregar un contenedor para Redis en el archivo docker-compose.yml.
4. Despliegue en Producción
A. Configuración de Servidor
- Usa NGINX como servidor proxy inverso para manejar las solicitudes HTTP y redirigirlas al backend y frontend.
B. SSL con Let’s Encrypt
- Configura certificados SSL para tu dominio utilizando Certbot.
C. Configuración de Base de Datos
- Asegúrate de que la base de datos PostgreSQL esté alojada en un entorno seguro y optimizado para producción.