He creat aquest programa amb una idea molt senzilla: evitar que el programa es tanqui quan l’usuari introdueix dades incorrectes.
Per aconseguir-ho, utilitzo blocs try i except. Aquests blocs funcionen com una xarxa de seguretat: si passa un error, el programa no es trenca, sinó que mostra un missatge i continua funcionant.
import http.server
import socketserver
import urllib.parse
PORT = 8000
class MiServidor(http.server.BaseHTTPRequestHandler):
def do_GET(self):
"""Dibuja el formulario de la LAN Party con diseño CLARO"""
self.send_response(200)
self.send_header("Content-type", "text/html; charset=utf-8")
self.end_headers()
html = f'''
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<title>Inscripció LAN Party</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body style="background-color:#f0f2f5; padding:20px;">
<div class="card p-4 shadow" style="max-width:600px; margin:auto; border-radius:15px; border-top:6px solid #8e44ad;">
<h2 class="text-center" style="color:#8e44ad; font-weight:800;">🎮 INSCRIPCIÓ LAN PARTY</h2>
<p class="text-center text-secondary">Formulari de registre oficial</p>
<hr>
<form method="POST" action="/reservar">
<div class="mb-3">
<label class="form-label">Nom</label>
<input type="text" name="nom" class="form-control" required>
</div>
<div class="mb-3">
<label class="form-label">Cognoms</label>
<input type="text" name="cognoms" class="form-control" required>
</div>
<div class="mb-3">
<label class="form-label">Nom d'usuari (Nickname)</label>
<input type="text" name="nickname" class="form-control" placeholder="Ex: ProGamer99" required>
</div>
<div class="mb-3">
<label class="form-label">Correu electrònic</label>
<input type="email" name="email" class="form-control" required>
</div>
<div class="mb-3">
<label class="form-label">Número de telèfon</label>
<input type="text" name="tel" class="form-control">
</div>
<div class="mb-3">
<label class="form-label">DNI / NIE</label>
<input type="text" name="dni" class="form-control">
</div>
<div class="mb-3 p-3 bg-light rounded border">
<label class="form-label d-block text-primary">📅 Quins dies assistiràs?</label>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" name="dies" value="Dia 10">
<label class="form-check-label">Dia 10</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" name="dies" value="Dia 11">
<label class="form-check-label">Dia 11</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" name="dies" value="Dia 12">
<label class="form-check-label">Dia 12</label>
</div>
</div>
<div class="mb-4">
<label class="form-label">Intoleràncies o al·lèrgies</label>
<textarea name="alergies" class="form-control" rows="2"></textarea>
</div>
<button type="submit" class="btn w-100"
style="background-color:#8e44ad; color:white; font-weight:bold;">
FINALITZAR REGISTRE
</button>
</form>
</div>
</body>
</html>
'''
self.wfile.write(html.encode("utf-8"))
def do_POST(self):
"""Gestiona el envío del formulario con validación y depuración"""
try:
content_length = int(self.headers.get('Content-Length', 0))
post_data = self.rfile.read(content_length).decode('utf-8')
params = urllib.parse.parse_qs(post_data)
# Función segura para obtener campos
def get_field(name):
return params.get(name, [""])[0].strip()
nickname = get_field("nickname")
dies_seleccionats = params.get("dies", [])
# Validación de nickname
if not nickname:
raise ValueError("El camp 'nickname' és obligatori.")
# Validación de días
dies_str = ", ".join(dies_seleccionats) if dies_seleccionats else "Cap dia seleccionat"
# Respuesta
self.send_response(200)
self.send_header("Content-type", "text/html; charset=utf-8")
self.end_headers()
if dies_seleccionats:
missatge = f"✅ REGISTRE COMPLET: Benvingut, <b>{nickname}</b>!<br>T'esperem els dies: <b>{dies_str}</b>."
color = "success"
else:
missatge = f"⚠️ ATENCIÓ {nickname}: T'has registrat però no has marcat cap dia."
color = "warning"
except Exception as e:
# Captura de errores inesperados
missatge = f"❌ ERROR: S'ha produït un problema amb el registre.<br><small>{str(e)}</small>"
color = "danger"
respost_html = f'''
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<div class="container text-center" style="padding-top:50px;">
<div class="card shadow p-5">
<h3 class="mb-4">Estat de la Inscripció</h3>
<div class="alert alert-{color}">{missatge}</div>
<a href="/" class="btn btn-outline-secondary mt-3">Tornar al formulari</a>
</div>
</div>
'''
self.wfile.write(respost_html.encode("utf-8"))
if __name__ == "__main__":
with socketserver.TCPServer(("", PORT), MiServidor) as httpd:
print(f"Servidor iniciado en http://localhost:{PORT}")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nServidor detenido.")
httpd.server_close()
Millor experiència d’usuari: el programa no es tanca mai de cop.
Seguretat: evita atacs com SQL Injection o entrades malicioses.
Estabilitat: només deixa passar dades correctes i segures.
He creat aquest sistema amb una visió clara: evitar que el programa falli davant d’entrades incorrectes i garantir una experiència d’usuari estable i segura. La depuració no és només una fase tècnica, sinó una estratègia preventiva que protegeix tant el funcionament del servidor com la integritat de les dades.
Per aconseguir-ho, he implementat blocs try-except que actuen com una xarxa de seguretat. Aquests blocs permeten capturar errors com ValueError o ZeroDivisionError i mostrar missatges clars a l’usuari, evitant que el sistema es tanqui de manera inesperada. A més, he afegit validacions de rang i format per assegurar que les dades introduïdes siguin coherents (ex: nombre de persones entre 1 i 4, franja horària vàlida, camps obligatoris complets).
En el formulari web, he combinat HTML amb Bootstrap per oferir una interfície accessible i clara. Al servidor, he estructurat el codi amb funcions auxiliars per gestionar les entrades de forma segura, i he utilitzat la terminal per rastrejar el comportament del sistema durant el desenvolupament.