Una aplicación más compleja
De WikiEducator
Contenido
- 1 Previo
- 2 Actividad
- 3 Instalar MySQL
- 4 Objetivo
- 5 Objetivo
- 6 Objetivo
- 7 Objetivo
- 8 Objetivo
- 9 Objetivo
- 10 Objetivo
- 11 Por dónde continuar ...
Previo
Seguiremos los siguientes tutoriales:
Repositorio de código de clase:
|
Estructura inicial
* Crear proyecto en eclipse
Tip: Estructura inicial
|
Páginas estáticas. Home y about
layout.html home.html about.html
Tip: Páginas estáticas
|
Formulario de contacto
Tip: Páginas estáticas
|
Estilo en formulario de contacto
|
Validación de formularios
|
Mensajes de error
Tip: Mensajes de error
|
Mensajes específicos de error
{% for mensaje in form.nombre.errors %} <div class="flash">{{ mensaje }}</div> {% endfor %} {% for mensaje in form.email.errors %} <div class="flash">{{ mensaje }}</div> {% endfor %} {% for mensaje in form.asunto.errors %} <div class="flash">{{ mensaje }}</div> {% endfor %} {% for mensaje in form.mensaje.errors %} <div class="flash">{{ mensaje }}</div> {% endfor %} |
Enviando correo
- Estensión: flask-mail
pip install flask-mail
from flask.ext.mail import Message, Mail # configuración MAIL_SERVER = "smtp.gmail.com" MAIL_PORT = 465 MAIL_USE_SSL = True MAIL_USERNAME = 'dwesdaw@gmail.com' # en mi ejemplo MAIL_PASSWORD = 'tu password' def contacto(): form = ContactForm() ... else: msg = Message(form.asunto.data, sender='dwesdaw@gmail.com', recipients=['destinatario']) msg.body = """ From: %s <%s> %s """ % (form.nombre.data, form.email.data, form.mensaje.data) mail.send(msg) return render_template('contacto.html', exito=True, nombre = form.nombre.data ) ...
Menú contactos
layout.html
Configuración base de datos
- Instalar mysql y python-mysql
SQLALCHEMY_DATABASE_URI = 'mysql://userflask:******@localhost/appFlask' from models import db db.init_app(app)
Modelo de usuario
models.py
db = SQLAlchemy() class User(db.Model): __tablename__ = 'usuarios' uid = db.Column(db.Integer, primary_key = True) nombre = db.Column(db.String(100)) apellido = db.Column(db.String(100)) email = db.Column(db.String(120), unique=True) pwdhash = db.Column(db.String(54)) def __init__(self, nombre, apellido, email, password): self.nombre = nombre.title() self.apellido = apellido.title() self.email = email.lower() self.set_password(password) def set_password(self, password): self.pwdhash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.pwdhash, password)
Página de perfil
Entrar y salir
Refactorización
Decidimos cambiar el modelo de la base de datos y utilizar el modelo declarativo de http://flask.pocoo.org/docs/patterns/sqlalchemy/ Eso exige cambios en la aplicación:
models.py
Las clases heredarán de declarative_base()
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Boolean, Column from sqlalchemy import DateTime, Integer, String, Text Base = declarative_base() class User(Base): __tablename__ = 'usuarios' uid = Column(Integer, primary_key = True) nombre = Column(String(100)) ...
Creación automática de las tablas:
Base.metadata.create_all(engine)
Las búsquedas se hacen ahora desde la sesión:
session.query(User).all():
app.py
... from models import Base, User from flask.ext.sqlalchemy import SQLAlchemy ... # Configuración SQL Alchemy db = SQLAlchemy(app) db.Model = Base
Para añadir ahora un usuario:
db.session.add(usuario) db.session.commit()
forms.py
Si el formulario necesita un acceso a la base de datos para la validación, hay que darle el objeto correspondiente:
class InscripcionForm(Form): ... # necesita parámetro db para hacer validación def validate(self, db): if not Form.validate(self): return False user = db.session.query(User).filter_by(email = self.email.data.lower()).first()
Y en la llamada al método validate desde app.py:
if form.validate(db) == False:
Despliegue en Apache
Despliegue en Heroku
Configuración
conf.py
SECRET_KEY = '\x84\xed\xca\xe36\x8d\x17\xd4\xb3X\xfd1\xdfJx\xc6\xe9\xcf\x00\xdf\x9e \xa9l' MAIL_SERVER = "smtp.gmail.com" MAIL_PORT = 465 MAIL_USE_SSL = True MAIL_USERNAME = 'dwesdaw@gmail.com' # en mi ejemplo MAIL_PASSWORD = 'tu password' SQLALCHEMY_DATABASE_URI = 'mysql://userflask:*******@localhost/appFlask'
app.py
from conf import * ... app = Flask(__name__) app.config.from_object(__name__) ...
Documentación adicional