🖥️ Desenvolupament Backend · Python + Flask + SQLite3

Prompt per Generar
Aplicació en Python

Institut Castellbisbal · CFGM Sistemes Microinformàtics i Xarxes · Curs 2025–2026

Araceli Saldaña Martínez

📋 1. Com fer-ho i fonaments

Per què Python i Flask?

Fem servir Python perquè l’HTML sol és estàtic (no canvia en funció de les dades). Amb Python i el framework Flask, podem convertir una web en una aplicació dinàmica capaç de processar, emmagatzemar i presentar informació en temps real.

💾 Persistència de dades
Guardar informació
  • Noms d’usuaris o punts en una base de dades
  • Dades persistents entre sessions
  • Fitxers locals .db amb SQLite3
🔐 Gestió de sessions
Recordar l’usuari
  • Sessions Flask per identificar l’usuari actiu
  • Clau secreta per a la signatura de cookies
  • Control d’accés per rols
📐 Arquitectura modular
Codi net i escalable
  • Codi separat en mòduls independents
  • Fàcil d’ampliar sense refer-ho tot
  • Compliment estricte de l’estàndard PEP 8
⚙️ 2. Evolució de l’Arquitectura i Resolució del Repte

Context del problema tècnic

Durant el desenvolupament del projecte es va detectar que els ordinadors de l’escola tenien restriccions d’administrador que impedien instal·lar paquets externs amb pip. Això va obligar a redissenyar l’arquitectura per eliminar totes les dependències de tercers i passar a una solució basada únicament en la biblioteca estàndard de Python.

❌ Codi inicial — MySQL + SQLAlchemy ModuleNotFoundError
from flask import Flask, render_template, request, session
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.secret_key = "clau_per_a_seguretat"

# Connexió Python → Base de dades MySQL externa
app.config['SQLALCHEMY_DATABASE_URI'] = (
    'mysql+pymysql://usuari:contrasenya@localhost/la_meva_db'
)
db = SQLAlchemy(app)

# Model de la taula de participants
class Participant(db.Model):
    id  = db.Column(db.Integer, primary_key=True)
    nom = db.Column(db.String(50))

⚠️ Per què fallava aquest codi?

Els ordinadors de l’escola no permetien instal·lar flask-sqlalchemy ni el connector pymysql. En intentar importar-los, Python llançava un ModuleNotFoundError i l’aplicació no s’iniciava.

  • Dependència externa: flask-sqlalchemy requereix instal·lació via pip.
  • Connector de base de dades: pymysql necessita un servidor MySQL en execució.
  • Entorn restringit: Sense permisos d’administrador, cap instal·lació externa és possible.
✅ Codi optimitzat — Flask + SQLite3 natiu Zero dependències
from flask import Flask, render_template, request, redirect
import sqlite3  # Mòdul integrat a Python — no cal instal·lar res!

app = Flask(__name__)

# 1. Inicialització automàtica de la base de dades local
def init_db():
    conn   = sqlite3.connect('database.db')
    cursor = conn.cursor()
    cursor.execute(
        'CREATE TABLE IF NOT EXISTS participants '
        '(id INTEGER PRIMARY KEY, name TEXT)'
    )
    conn.commit()
    conn.close()

init_db()  # S'executa en arrencar l'aplicació

# 2. Ruta principal: llegeix i mostra tots els participants
@app.route('/')
def index():
    conn   = sqlite3.connect('database.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM participants')
    data   = cursor.fetchall()
    conn.close()
    return render_template('index.html', participants=data)

# 3. Ruta d'inserció: rep el formulari i insereix de manera segura
@app.route('/add', methods=['POST'])
def add_name():
    user_name = request.form.get('name')
    if user_name:
        conn   = sqlite3.connect('database.db')
        cursor = conn.cursor()
        # Ús de paràmetres (?) per prevenir injecció SQL
        cursor.execute(
            'INSERT INTO participants (name) VALUES (?)',
            (user_name,)
        )
        conn.commit()
        conn.close()
    return redirect('/')

if __name__ == '__main__':
    app.run(debug=True)

Per què SQLite3 és la solució correcta en aquest entorn?

sqlite3 és un mòdul integrat a Python des de la versió 2.5. No requereix cap instal·lació externa ni servidor de base de dades. Emmagatzema totes les dades en un únic fitxer local .db, la qual cosa fa l’aplicació completament portable i funcional en qualsevol ordinador de l’escola.

📊 Comparativa tècnica entre les dues arquitectures

Criteri MySQL + SQLAlchemy SQLite3 natiu
Instal·lació externa Sí (pip, pymysql) No — inclòs a Python
Servidor de BD necessari Sí (MySQL Server) No — fitxer local
Portabilitat en entorns restringits Baixa Total
Complexitat d’instal·lació Alta Cap
Adequació per a projectes escolars Baixa Molt alta
Prevenció d’injecció SQL Via ORM (SQLAlchemy) Via paràmetres (?)
🤖 3. Enginyeria de Prompts (Prompt Engineering)

Què és l’enginyeria de prompts?

L’enginyeria de prompts és la disciplina de redactar instruccions precises per a models d’intel·ligència artificial amb l’objectiu d’obtenir resultats de màxima qualitat. Un bon prompt especifica el rol de la IA, el context, els requisits tècnics i el format de sortida esperat. A continuació es presenten quatre prompts dissenyats per a aquest projecte, del més bàsic al més professional.

Context clar Rol assignat Requisits específics Format de sortida Restriccions tècniques
🟡 Prompt original — Nivell bàsic (usuari)
Primera versió, formulada de manera espontània per resoldre l’error de bloqueig escolar. Funciona, però és poc precisa.
«Tinc un error al portàtil de l’escola perquè no puc instal·lar Flask. Pots donar-me un codi en Python que utilitzi només biblioteques natives per crear un servidor web que guardi dades en un fitxer .txt i que tingui un disseny de color verd neó?»
🟢 Prompt 1 — Arquitectura portable (nivell professional)
Optimitzat per obtenir directament el codi robust basat en SQLite3 i arquitectura neta, sense ambigüitats.
«Actua com un desenvolupador backend expert en Python i Flask. Necessito dissenyar una aplicació web lleugera destinada a un entorn educatiu restringit (sense permisos d’administrador per instal·lar paquets com flask-sqlalchemy o servidors externs de bases de dades).

Requisits estrictes:
1. Framework i persistència: Utilitza Flask per al servidor web, però gestiona la base de dades mitjançant el mòdul natiu sqlite3 de Python per garantir zero dependències de tercers.
2. Estructura del codi: El codi ha de ser modular i net, seguint la guia d’estil PEP 8. Ha d’incloure una funció d’inicialització automatitzada (init_db) per crear la taula de ‘participants’ (id, name) si el fitxer .db local no existeix.
3. Rutes: Configura una ruta arrel / que llegeixi els registres i una ruta /add que rebi peticions POST per inserir nous participants de manera segura (prevenint injecció SQL).
4. Interfície: Proporciona tant el codi Python com la plantilla HTML bàsica associada.»
🟢 Prompt 2 — Disseny d’interfície UI/UX (nivell professional)
Enfocat a resoldre la petició de disseny de manera professional, amb especificacions visuals concretes i sense frameworks externs.
«Com a dissenyadora d’interfícies UI/UX web, necessito una plantilla HTML i CSS integrada en un únic fitxer (per a Flask render_template) per a una aplicació de registre escolar.

Especificacions estètiques:
Estil visual: Estètica fosca d’estil tecnològic, minimalista.
Paleta de colors: Fons completament fosc, accents i tipografia principal en verd neó (#00ff66), text secundari en blanc trencat.
Disposició: Una graella neta on es mostri a un costat el formulari d’entrada per a nous participants i a l’altre la llista de dades recuperades.
CSS natiu pur: Evita frameworks externs (Tailwind, Bootstrap). Genera el CSS dins d’una etiqueta <style> en el mateix fitxer.»
🟢 Prompt 3 — Documentació tècnica d’arquitectura (nivell professional)
Creat per generar un informe tècnic justificant la migració de MySQL a SQLite3 per incloure a la memòria del projecte.
«Actua com una enginyera de programari i redactora tècnica. Tinc un codi que utilitzava una arquitectura amb Flask, SQLAlchemy i MySQL (amb models de dades ORM) i l’he hagut de migrar a Flask amb SQLite3 natiu a causa de limitacions tècniques en l’entorn d’execució (ordinadors escolars sense accés a instal·lacions pip).

Genera un informe tècnic d’arquitectura titulat ‘Justificació del Canvi Tecnològic i Portabilitat’. Detalla:
— Els avantatges del mòdul natiu per a la reducció de fricció en el desplegament.
— La facilitat de distribució gràcies a les bases de dades basades en fitxers locals.
— El compliment de tots els requisits funcionals sense pèrdua de consistència de dades ni de seguretat contra injeccions SQL.»
✅ 4. Conclusions

Resultats assolits

  • Resolució de l’error tècnic: La migració de SQLAlchemy + MySQL a SQLite3 natiu ha permès executar l’aplicació en qualsevol entorn escolar sense necessitat de permisos d’administrador.
  • Codi net i professional: El codi final segueix l’estàndard PEP 8 i incorpora prevenció d’injecció SQL mitjançant paràmetres preparats.
  • Enginyeria de prompts aplicada: L’ús de prompts precisos i estructurats ha permès obtenir codi de qualitat professional directament des d’eines d’IA.
  • Portabilitat total: L’aplicació s’executa sense instal·lació addicional en qualsevol ordinador amb Python 3 instal·lat.
  • Documentació completa: El projecte inclou justificació tècnica de totes les decisions d’arquitectura, apta per a memòria de pràctiques de nivell PRO+.
🐍 Stack tecnològic
Tecnologies
  • Python 3.x
  • Flask (framework web)
  • SQLite3 (mòdul natiu)
  • HTML + CSS natiu
🤖 Eines d’IA emprades
Prompt Engineering
  • 4 prompts dissenyats
  • Del nivell bàsic al professional
  • Rol + context + requisits
  • Format de sortida especificat
✅ Criteris de qualitat
Estàndards aplicats
  • PEP 8 — estil de codi
  • Zero dependències externes
  • Prevenció d’injecció SQL
  • Arquitectura modular

TOP
🤖 Assistent d'Araceli Saldaña
Hola! 👋 Soc l'assistent virtual de l'Araceli Saldaña.
Pregunta'm qualsevol cosa sobre el seu portafolis SMX! 😊