-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
118 lines (102 loc) · 4.25 KB
/
app.py
File metadata and controls
118 lines (102 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from flask import Flask, render_template, redirect, url_for, g
from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField, SubmitField, SelectField
from wtforms.validators import DataRequired, Email, Length, NumberRange
import sqlite3
# --- Configuración de Flask ---
app = Flask(__name__)
# ¡IMPORTANTE! Reemplaza esto con una clave secreta segura en un entorno real
app.config['SECRET_KEY'] = 'mi_clave_secreta_super_segura_123'
DATABASE = 'database.db'
# --- Conexión a la Base de Datos ---
def get_db():
"""Obtiene y devuelve la conexión a la base de datos."""
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(DATABASE)
# Configura la conexión para devolver filas como diccionarios
db.row_factory = sqlite3.Row
return db
@app.teardown_appcontext
def close_connection(exception):
"""Cierra la conexión a la base de datos al finalizar el contexto de la aplicación."""
db = getattr(g, '_database', None)
if db is not None:
db.close()
def init_db():
"""Inicializa la base de datos (crea la tabla)."""
with app.app_context():
db = get_db()
# SQL para crear la tabla de compradores con 6 campos
db.execute("""
CREATE TABLE IF NOT EXISTS compradores (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT NOT NULL,
email TEXT NOT NULL,
telefono TEXT,
ciudad TEXT,
tipo_flor TEXT,
cantidad INTEGER
)
""")
db.commit()
# Llama a init_db() para asegurar que la tabla exista al inicio
init_db()
# --- Definición del Formulario (Flask-WTF) ---
class CompradorForm(FlaskForm):
"""Formulario para el registro de compradores de flores."""
nombre = StringField('Nombre Completo', validators=[DataRequired(), Length(min=2, max=100)])
email = StringField('Email', validators=[DataRequired(), Email()])
telefono = StringField('Teléfono', validators=[Length(max=15)])
ciudad = StringField('Ciudad', validators=[DataRequired(), Length(max=50)])
tipo_flor = SelectField('Tipo de Flor Favorita', choices=[
('Rosa', 'Rosa'),
('Tulipán', 'Tulipán'),
('Girasol', 'Girasol'),
('Orquídea', 'Orquídea')
], validators=[DataRequired()])
cantidad = IntegerField('Cantidad (unidades)', validators=[DataRequired(), NumberRange(min=1, max=1000)])
submit = SubmitField('Registrar Comprador')
# --- Rutas de la Aplicación ---
@app.route('/')
def home():
return redirect(url_for('registro'))
@app.route('/registro', methods=['GET', 'POST'])
def registro():
"""Ruta para el formulario de registro."""
form = CompradorForm()
if form.validate_on_submit():
# Recoger datos del formulario
nombre = form.nombre.data
email = form.email.data
telefono = form.telefono.data
ciudad = form.ciudad.data
tipo_flor = form.tipo_flor.data
cantidad = form.cantidad.data
# Insertar en la Base de Datos
try:
db = get_db()
db.execute(
"INSERT INTO compradores (nombre, email, telefono, ciudad, tipo_flor, cantidad) VALUES (?, ?, ?, ?, ?, ?)",
(nombre, email, telefono, ciudad, tipo_flor, cantidad)
)
db.commit()
# Redirigir a una página de éxito o al listado
return redirect(url_for('listado'))
except sqlite3.Error as e:
# Manejar errores de DB si es necesario
print(f"Error de base de datos: {e}")
# Mostrar el formulario
return render_template('formulario.html', form=form, title='Registro de Compradores')
@app.route('/listado')
def listado():
"""Ruta para mostrar la lista de compradores registrados."""
db = get_db()
# Ejecutar consulta para obtener todos los compradores
compradores = db.execute("SELECT * FROM compradores ORDER BY id DESC").fetchall()
# Mostrar la plantilla de listado
return render_template('listado.html', compradores=compradores, title='Listado de Compradores')
# --- Ejecución de la Aplicación ---
# if __name__ == '__main__':
# # Usar puerto 5000 por defecto para desarrollo
# app.run(debug=True)