Benvigut/da al meu portafoli digital, on podràs veure els treballs que fem al CFGM de sistemes microinformàtics i xarxes
Erik Amigó Kuhn - SMX
Prompt per generar aplicació en Python

Prompt per generar aplicació en Python

Per què fem servir Python i Flask?

Cal entendre la diferència entre una web estàtica i una de dinàmica.

· Web estàtica (Htlm i CSS): La informació és fixa i només es pot llegir, no es pot modificar ni guardar dades ni interactuar amb la base de dades.

· Web dinàmica (Python i Flask): El Python actua com el Backend

  • Connexió amb Base de Dades: Python ens permet connectar la web amb MySQL per guardar registres, llegir dades i generar informes en temps real.
  • Processament de dades: Ens permet fer que la web “faci coses”, com validar un formulari, gestionar sessions d’usuari (login) i escalar l’aplicació a mesura que creix.
  • Gestió de rutes: Python decideix què mostrar a l’usuari en funció de les seves accions, enviant dades de la base de dades directament a la interfície.

El prompt que vaig utilitzar per generar el codi Python amb la IA, per fer el registre de la LAN Party, va ser el següent:

Vull que em facis un formulari de registre per a la LAN Party de l’Institut Castellbisbal amb codi Python. El formulari ha de ser en català i ha de preguntar el nom, cognoms, el “nickname”, telèfon, correu electrònic, dies d’assistència (10, 11 i 12 d’abril), DNI/NIE i si hi ha alguna intolerància.

Vull que els colors siguin contrastants perquè hi sigui visible i estètic.

El codi que em va generar va ser el següent:

import http.server
import socketserver
import urllib.parse

# Configuración del puerto
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 con diseño CLARO y acentos morados
        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">
            <style>
                /* Fondo general gris muy suave para no cansar la vista */
                body {{ background-color: #f0f2f5; padding: 20px; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }}
                
                /* Tarjeta blanca con sombra suave */
                .card {{ 
                    max-width: 600px; 
                    margin: auto; 
                    border: none; 
                    border-radius: 15px; 
                    background-color: #ffffff; 
                    box-shadow: 0 4px 15px rgba(0,0,0,0.1);
                    border-top: 6px solid #8e44ad; /* Borde superior morado */
                }}

                /* Títulos y textos */
                h2 {{ color: #8e44ad; font-weight: 800; }} /* Morado intenso */
                .form-label {{ font-weight: 600; color: #34495e; }}
                
                /* Botón personalizado morado */
                .btn-gamer {{
                    background-color: #8e44ad;
                    color: white;
                    font-weight: bold;
                    padding: 12px;
                    transition: background 0.3s;
                    border: none;
                }}
                .btn-gamer:hover {{
                    background-color: #732d91;
                    color: white;
                }}

                /* Inputs más visibles */
                .form-control:focus {{
                    border-color: #8e44ad;
                    box-shadow: 0 0 0 0.25rem rgba(142, 68, 173, 0.25);
                }}
            </style>
        </head>
        <body>
            <div class="card p-4">
                <h2 class="text-center">🎮 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" style="background-color: #f8f9fa;" required>
                    </div>

                    <div class="mb-3">
                        <label class="form-label">Cognoms</label>
                        <input type="text" name="cognoms" class="form-control" style="background-color: #f8f9fa;" 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" style="border: 2px solid #ddd;" 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" placeholder="Ex: Celíac, fruits secs..."></textarea>
                    </div>

                    <button type="submit" class="btn btn-gamer w-100">FINALITZAR REGISTRE</button>
                </form>
            </div>
        </body>
        </html>
        '''
        self.wfile.write(html.encode("utf-8"))

    def do_POST(self):
        """Gestiona el envío del formulario"""
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length).decode('utf-8')
        params = urllib.parse.parse_qs(post_data)

        # Extraer datos
        nickname = params.get('nickname', [''])[0]
        dies_selecionats = params.get('dies', [])
        
        dies_str = ", ".join(dies_selecionats) if dies_selecionats else "Cap dia seleccionat"

        self.send_response(200)
        self.send_header("Content-type", "text/html; charset=utf-8")
        self.end_headers()

        # Respuesta visual
        missatge = f"✅ REGISTRE COMPLET: Benvingut, <b>{nickname}</b>!<br>T'esperem els dies: <b>{dies_str}</b>."
        color = "success" # Verde
        
        if not dies_selecionats:
            color = "warning" # Amarillo
            missatge = f"⚠️ ATENCIÓ {nickname}: T'has registrat però no has marcat cap dia."

        respost_html = f'''
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
        <style>body {{ background-color: #f0f2f5; font-family: sans-serif; padding-top: 50px; }}</style>
        <div class="container text-center">
            <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"))

# --- BLOQUE PRINCIPAL ---
if __name__ == "__main__":
    with socketserver.TCPServer(("", PORT), MiServidor) as httpd:
        print(f"✅ Servidor iniciado en http://localhost:{PORT}")
        print("Presiona Ctrl+C en la terminal para detenerlo.")
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            print("\n🛑 Servidor detenido.")
            httpd.server_close()

I el formulari que va generar va ser el següent: