Skip to content

Commit b0348f4

Browse files
committed
soluciones ejercicios clase 1 modulo 4
1 parent a4f92a3 commit b0348f4

File tree

20 files changed

+510
-1
lines changed

20 files changed

+510
-1
lines changed

modulo-4-clase-1/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Modulo 4 - Clase 1 Frameworks de desarrollo Web
1+
# Modulo 4 - Clase 1 Introducción al desarrollo con frameworks
22

33
## Ejercicios
44

modulo-4-clase-1/bloque-a-ej-1/app.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# app.py
2+
from views import View
3+
from server import start_server
4+
5+
# Definimos un diccionario de rutas para mapear rutas URL a vistas específicas
6+
ROUTES = {
7+
"/": View(), # La ruta raíz se asocia con HelloView
8+
}
9+
10+
def route_request(path):
11+
# Buscar la vista asociada a la ruta; si no se encuentra, devolver None
12+
view = ROUTES.get(path)
13+
if view:
14+
return view.get_response()
15+
else:
16+
return "404 Not Found" # Respuesta de error si la ruta no existe
17+
18+
if __name__ == "__main__":
19+
# Iniciar el servidor en el puerto 8000
20+
start_server(port=8000, route_handler=route_request)
+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# server.py
2+
from http.server import BaseHTTPRequestHandler, HTTPServer
3+
4+
class RequestHandler(BaseHTTPRequestHandler):
5+
"""
6+
Manejador de solicitudes HTTP que procesa las peticiones GET entrantes.
7+
Hereda de BaseHTTPRequestHandler para implementar un servidor HTTP básico.
8+
"""
9+
10+
def __init__(self, *args, route_handler=None, **kwargs):
11+
"""
12+
Inicializa el manejador de solicitudes.
13+
14+
Args:
15+
route_handler: Función que maneja el enrutamiento de las solicitudes
16+
*args: Argumentos posicionales adicionales
17+
**kwargs: Argumentos de palabra clave adicionales
18+
"""
19+
self.route_handler = route_handler
20+
super().__init__(*args, **kwargs)
21+
22+
def do_GET(self):
23+
"""
24+
Procesa las solicitudes GET entrantes.
25+
Obtiene la ruta de la solicitud y la pasa al manejador de rutas.
26+
Envía la respuesta correspondiente al cliente.
27+
"""
28+
# Obtener la ruta de la solicitud
29+
path = self.path
30+
31+
# Llamar al manejador de rutas para obtener la respuesta
32+
if self.route_handler:
33+
response = self.route_handler(path)
34+
else:
35+
response = "404 Not Found"
36+
37+
# Configurar la respuesta HTTP
38+
self.send_response(200 if response != "404 Not Found" else 404)
39+
self.send_header("Content-Type", "text/plain")
40+
self.end_headers()
41+
42+
# Enviar la respuesta al cliente
43+
self.wfile.write(response.encode("utf-8"))
44+
45+
def start_server(port=8000, route_handler=None):
46+
"""
47+
Inicia el servidor HTTP en el puerto especificado.
48+
49+
Args:
50+
port: Puerto en el que se ejecutará el servidor (por defecto 8000)
51+
route_handler: Función que maneja el enrutamiento de las solicitudes
52+
"""
53+
# Crear una función para inicializar el servidor con un route_handler personalizado
54+
def handler(*args, **kwargs):
55+
RequestHandler(*args, route_handler=route_handler, **kwargs)
56+
57+
# Configurar y ejecutar el servidor
58+
server_address = ('', port)
59+
httpd = HTTPServer(server_address, handler)
60+
print(f"Servidor corriendo en el puerto {port}...")
61+
httpd.serve_forever()
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# views.py
2+
3+
class View:
4+
"""
5+
Vista simple que maneja la ruta raíz del servidor.
6+
Implementa un endpoint básico que devuelve un saludo.
7+
"""
8+
9+
def get_response(self):
10+
"""
11+
Genera la respuesta HTTP para esta vista.
12+
13+
Returns:
14+
str: Un mensaje de saludo "Hello, World!"
15+
"""
16+
return "Hello, World!"

modulo-4-clase-1/bloque-a-ej-2/app.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# app.py
2+
from views import View
3+
from server import start_server
4+
5+
# Definimos un diccionario de rutas para mapear rutas URL a vistas específicas
6+
ROUTES = {
7+
"/": View(), # La ruta raíz se asocia con HelloView
8+
}
9+
10+
def route_request(path):
11+
# Buscar la vista asociada a la ruta; si no se encuentra, devolver None
12+
view = ROUTES.get(path)
13+
if view:
14+
return view.get_response()
15+
else:
16+
return "404 Not Found" # Respuesta de error si la ruta no existe
17+
18+
if __name__ == "__main__":
19+
# Iniciar el servidor en el puerto 8000
20+
start_server(port=8000, route_handler=route_request)
+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# server.py
2+
from http.server import BaseHTTPRequestHandler, HTTPServer
3+
4+
class RequestHandler(BaseHTTPRequestHandler):
5+
"""
6+
Manejador de solicitudes HTTP que procesa las peticiones GET entrantes.
7+
Hereda de BaseHTTPRequestHandler para implementar un servidor HTTP básico.
8+
"""
9+
10+
def __init__(self, *args, route_handler=None, **kwargs):
11+
"""
12+
Inicializa el manejador de solicitudes.
13+
14+
Args:
15+
route_handler: Función que maneja el enrutamiento de las solicitudes
16+
*args: Argumentos posicionales adicionales
17+
**kwargs: Argumentos de palabra clave adicionales
18+
"""
19+
self.route_handler = route_handler
20+
super().__init__(*args, **kwargs)
21+
22+
def do_GET(self):
23+
"""
24+
Procesa las solicitudes GET entrantes.
25+
Obtiene la ruta de la solicitud y la pasa al manejador de rutas.
26+
Envía la respuesta correspondiente al cliente.
27+
"""
28+
# Obtener la ruta de la solicitud
29+
path = self.path
30+
31+
# Llamar al manejador de rutas para obtener la respuesta
32+
if self.route_handler:
33+
response = self.route_handler(path)
34+
else:
35+
response = "404 Not Found"
36+
37+
# Configurar la respuesta HTTP
38+
self.send_response(200 if response != "404 Not Found" else 404)
39+
self.send_header("Content-Type", "text/html")
40+
self.end_headers()
41+
42+
# Enviar la respuesta al cliente
43+
self.wfile.write(response.encode("utf-8"))
44+
45+
def start_server(port=8000, route_handler=None):
46+
"""
47+
Inicia el servidor HTTP en el puerto especificado.
48+
49+
Args:
50+
port: Puerto en el que se ejecutará el servidor (por defecto 8000)
51+
route_handler: Función que maneja el enrutamiento de las solicitudes
52+
"""
53+
# Crear una función para inicializar el servidor con un route_handler personalizado
54+
def handler(*args, **kwargs):
55+
RequestHandler(*args, route_handler=route_handler, **kwargs)
56+
57+
# Configurar y ejecutar el servidor
58+
server_address = ('', port)
59+
httpd = HTTPServer(server_address, handler)
60+
print(f"Servidor corriendo en el puerto {port}...")
61+
httpd.serve_forever()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import os
2+
3+
# Directorio donde se almacenan los archivos de plantillas
4+
TEMPLATES_DIR = "templates"
5+
6+
def render_template(template_name):
7+
"""
8+
Carga y devuelve el contenido de un archivo de plantilla.
9+
10+
Esta función busca un archivo de plantilla en el directorio de templates
11+
y retorna su contenido como una cadena de texto.
12+
13+
Args:
14+
template_name (str): Nombre del archivo de plantilla a cargar
15+
16+
Returns:
17+
str: Contenido del archivo de plantilla si existe,
18+
"Template not found" si el archivo no se encuentra
19+
20+
Raises:
21+
FileNotFoundError: Si el archivo de plantilla no existe en el directorio
22+
"""
23+
try:
24+
with open(os.path.join(TEMPLATES_DIR, template_name), "r") as template_file:
25+
return template_file.read()
26+
except FileNotFoundError:
27+
return "Template not found"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Home</title>
6+
</head>
7+
<body>
8+
<h1>Hello, World!</h1>
9+
<p>Mi framework MVC!</p>
10+
</body>
11+
</html>
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# views.py
2+
from templates import render_template
3+
4+
class View:
5+
"""
6+
Clase base para las vistas que manejan las respuestas HTTP.
7+
Proporciona métodos para renderizar templates HTML.
8+
"""
9+
10+
def get_response(self):
11+
"""
12+
Maneja la vista de la página principal.
13+
14+
Returns:
15+
str: Nombre del archivo de template HTML para la página principal ('home.html')
16+
"""
17+
return render_template("home.html")

modulo-4-clase-1/bloque-a-ej-3/app.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# app.py
2+
from views import View
3+
from server import start_server
4+
5+
# Definimos un diccionario de rutas para mapear rutas URL a vistas específicas
6+
ROUTES = {
7+
"/": View(), # La ruta raíz se asocia con HelloView
8+
}
9+
10+
def route_request(path):
11+
# Buscar la vista asociada a la ruta; si no se encuentra, devolver None
12+
view = ROUTES.get(path)
13+
if view:
14+
return view.get_response()
15+
else:
16+
return "404 Not Found" # Respuesta de error si la ruta no existe
17+
18+
if __name__ == "__main__":
19+
# Iniciar el servidor en el puerto 8000
20+
start_server(port=8000, route_handler=route_request)
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# modelos.py
2+
avisos = [
3+
{"fecha": "2024-11-06", "titulo": "Primer aviso", "autor": "Autor A"},
4+
{"fecha": "2024-11-07", "titulo": "Segundo aviso", "autor": "Autor B"},
5+
{"fecha": "2024-11-08", "titulo": "Tercer aviso", "autor": "Autor C"},
6+
]
7+
8+
class Aviso:
9+
def all(self):
10+
"""Retorna todos los avisos como una lista de diccionarios."""
11+
return avisos
+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# server.py
2+
from http.server import BaseHTTPRequestHandler, HTTPServer
3+
4+
class RequestHandler(BaseHTTPRequestHandler):
5+
"""
6+
Manejador de solicitudes HTTP que procesa las peticiones GET entrantes.
7+
Hereda de BaseHTTPRequestHandler para implementar un servidor HTTP básico.
8+
"""
9+
10+
def __init__(self, *args, route_handler=None, **kwargs):
11+
"""
12+
Inicializa el manejador de solicitudes.
13+
14+
Args:
15+
route_handler: Función que maneja el enrutamiento de las solicitudes
16+
*args: Argumentos posicionales adicionales
17+
**kwargs: Argumentos de palabra clave adicionales
18+
"""
19+
self.route_handler = route_handler
20+
super().__init__(*args, **kwargs)
21+
22+
def do_GET(self):
23+
"""
24+
Procesa las solicitudes GET entrantes.
25+
Obtiene la ruta de la solicitud y la pasa al manejador de rutas.
26+
Envía la respuesta correspondiente al cliente.
27+
"""
28+
# Obtener la ruta de la solicitud
29+
path = self.path
30+
31+
# Llamar al manejador de rutas para obtener la respuesta
32+
if self.route_handler:
33+
response = self.route_handler(path)
34+
else:
35+
response = "404 Not Found"
36+
37+
# Configurar la respuesta HTTP
38+
self.send_response(200 if response != "404 Not Found" else 404)
39+
self.send_header("Content-Type", "text/html")
40+
self.end_headers()
41+
42+
# Enviar la respuesta al cliente
43+
self.wfile.write(response.encode("utf-8"))
44+
45+
def start_server(port=8000, route_handler=None):
46+
"""
47+
Inicia el servidor HTTP en el puerto especificado.
48+
49+
Args:
50+
port: Puerto en el que se ejecutará el servidor (por defecto 8000)
51+
route_handler: Función que maneja el enrutamiento de las solicitudes
52+
"""
53+
# Crear una función para inicializar el servidor con un route_handler personalizado
54+
def handler(*args, **kwargs):
55+
RequestHandler(*args, route_handler=route_handler, **kwargs)
56+
57+
# Configurar y ejecutar el servidor
58+
server_address = ('', port)
59+
httpd = HTTPServer(server_address, handler)
60+
print(f"Servidor corriendo en el puerto {port}...")
61+
httpd.serve_forever()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import os
2+
3+
# Directorio donde se almacenan los archivos de plantillas
4+
TEMPLATES_DIR = "templates"
5+
6+
def render_template(template_name):
7+
"""
8+
Carga y devuelve el contenido de un archivo de plantilla.
9+
10+
Esta función busca un archivo de plantilla en el directorio de templates
11+
y retorna su contenido como una cadena de texto.
12+
13+
Args:
14+
template_name (str): Nombre del archivo de plantilla a cargar
15+
16+
Returns:
17+
str: Contenido del archivo de plantilla si existe,
18+
"Template not found" si el archivo no se encuentra
19+
20+
Raises:
21+
FileNotFoundError: Si el archivo de plantilla no existe en el directorio
22+
"""
23+
try:
24+
with open(os.path.join(TEMPLATES_DIR, template_name), "r") as template_file:
25+
return template_file.read()
26+
except FileNotFoundError:
27+
return "Template not found"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Home</title>
6+
</head>
7+
<body>
8+
<h1>Hello, World!</h1>
9+
<p>Mi framework MVC!</p>
10+
</body>
11+
</html>

0 commit comments

Comments
 (0)