Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Python 3
  3. Crear una aplicación web en 30 minutos
Extrait - Python 3 Los fundamentos del lenguaje (4ª edición)
Extractos del libro
Python 3 Los fundamentos del lenguaje (4ª edición) Volver a la página de compra del libro

Crear una aplicación web en 30 minutos

Descripción de la aplicación que se va a construir

Como hemos especificado en el capítulo anterior, vamos a construir una aplicación que permite ilustrar varios campos técnicos distintos. Este capítulo se centra en la parte principal: la aplicación web.

De hecho, para construir esta aplicación, vamos a usar un generador de código que hará una gran parte del trabajo por nosotros.

Por cuestiones prácticas, hay que empezar por este capítulo para poder hacer los siguientes.

La aplicación, en su globalidad, es un simple formulario de contacto.

La solución web que vamos a utilizar es Pyramid, un framework web que utiliza distintos módulos de Python bien contrastados y sobre los que se basa para ofrecer una solución fiable, pero flexible, pues en todo momento es posible remplazar alguno de los módulos por otro (por ejemplo, cambiar el módulo que gestiona el templating, o el que gestiona la autenticación, o incluso el que gestiona el enrutado...). El desacople de estos módulos es una de las ventajas de este framework.

La solución para gestionar la persistencia que vamos a utilizar es PostgreSQL.

Cabe destacar que la primera edición de este libro utilizaba TurboGears. Esta solución sigue siendo excelente e implementa varios componentes similares a Pyramid así como muchos otros bastante específicos e interesantes...

Implementación

1. Aislar el entorno

Para esta parte vamos a utilizar el trabajo realizado en el capítulo anterior.

Para entrar en el entorno de trabajo, solo tiene que situarse en el directorio del proyecto y ejecutar los comandos:

$ docker compose up -d 
$ docker compose run project_main bash 

Así abrirá un terminal en el entorno de trabajo.

Hay que destacar que Pyramid hace algunas elecciones importantes, como la que consiste en usar cookie cutter para generar el código inicial del proyecto; lo veremos inmediatamente después.

La plantilla de código usa un método antiguo para empaquetar la aplicación, se basa en un archivo setup.py.

Le invito a seguir los distintos tutoriales de Pyramid para profundizar en este aspecto, en particular porque este tutorial evita repetir y presentar aspectos que ya aparecen en los tutoriales y ofrece complementos mostrando técnicas que no están incluidas en ellos.

A pesar de eso, por nuestra parte, vamos a hacer empaquetado usando poetry y, por lo tanto, el archivo pyproject.toml ya iniciado en el capítulo anterior, pero igualmente vamos a usar la misma base de código que el tutorial oficial de Pyramid, utilizado el mismo cookie cutter de plantillas.

2. Creación del proyecto

La primera etapa consiste en instalar Pyramid con poetry si no lo ha hecho antes:

$ poetry add pyramid  

Si funciona correctamente, el siguiente comando debería funcionar:

$ pserve -help 

pserve es el servidor web Python que permite ejecutar la aplicación con el objetivo de desarrollarla, ofreciendo herramientas para el desarrollo (no sirve para poner la aplicación en producción, pues ese es el rol de apache2+wsgi).

Tan solo queda crear el proyecto:

$ poetry add cookiecutter 
$ cookiecutter gh:Pylons/pyramid-cookiecutter-starter --checkout 2.0-branch 

Este último comando es estrictamente idéntico al del tutorial oficial, lo que permite generar un código idéntico al que habría obtenido usando el método presentado en el tutorial.

3. Configuración

Una vez creado el proyecto, hay que ubicarse en la carpeta que lo contiene:

$ cd project/ 

La primera etapa consiste en abrir el archivo setup.py y personalizarlo (esta función no es útil en nuestro caso, pero permite garantizar la compatibilidad con el método clásico):

$ vi setup.py 

He aquí los campos que es preciso modificar, entre otros:

  • version

  • description

  • author

  • author_email

  • install_requires

  • paster_plugins

  • tests_require

  • message extractors

  • entry_points

Los últimos puntos deben modificarse cuando se conocen bien los componentes y se quieren aportar los cambios.

Para los install_requires, podremos considerar la posibilidad de añadir el conector a la base de datos elegida (si no se ha hecho en el capítulo anterior) y habrá que especificar...

Realizar la aplicación

A continuación, pasamos a realizar la aplicación. Para ello, vamos a empezar presentando los modelos en su integridad y, a continuación, las vistas para mostrar cómo se organizan y muestran los datos; por último veremos los controladores para manipularlos y vincular las vistas al modelo.

1. Modelos

Esta sección es particular, pues este modelo sirve también como base a los proyectos detallados en los siguientes capítulos. Vamos a escribir el modelo en un archivo project.py situado en la carpeta project/models.

Contiene:

# -*- coding: utf-8 -*- 
 
from datetime import datetime  
 
from sqlalchemy import ( 
    Column, 
    ForeignKey, 
    Index, 
    Integer,     UnicodeText, 
    Unicode, 
    DateTime, 
    ) 
 
 
from .meta_import_base 
 
__all__ = ['Subject', 'Contact']  
  class Subject(Base): 
    __tablename__ = 'subjects' 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode(255), unique=True) 
 
Index('subject_name_index', Subject.name, unique=True, 
mysql_length=255) 
 
class Contact(Base): 
    __tablename__ = 'contacts' 
    id = Column(Integer, primary_key=True) 
    email = Column(Unicode(255), nullable=False) 
    subject_id = Column(Integer, ForeignKey(Subject.id)) 
    text = Column(UnicodeText, nullable=False) 
    created = Column(DateTime, default=datetime.now) 
 
Index('contact_email_index', Contact.email, mysql_length=255) 

Conocer SQLAlchemy es un requisito previo que se explica en el capítulo Manipulación de datos.

Este ejemplo muestra cómo hacer que un campo sea obligatorio o único, cómo colocar índices, claves primarias y claves foráneas o valores por defecto, como la fecha en curso.

Una vez escritos los modelos, hay que gestionar las migraciones. En efecto, en producción, es necesario mantener la base de datos. Cada vez que se hacen modificaciones, hay que generar un script que permita pasar de una estructura dada a la nueva. Son las migraciones.

Existe una herramienta que nos permite gestionarlas automáticamente. Cada vez que modifique los modelos, podrá escribir:

$ alembic -c development.ini revision --autogenerate -m "Add new models" 

La palabra importante es revision. El comentario permite describir el cambio que se ha producido en los modelos desde la última versión.

Para aplicar esta migración, es decir, hacer que la base de datos sea conforme con los modelos descritos en el código, hay que aplicar el siguiente comando:

$alembic -c development.ini upgrade head 

Ahora podemos utilizar nuestros modelos y una sesión para modificar datos en la base de datos. Vamos a empezar inmediatamente modificando el script de inicialización de datos que se encuentra en contact/scripts/initializedb.py de la siguiente manera:

import argparse 
import sys 
import transaction 
 
from pyramid.paster import bootstrap, setup_logging, 
from sqlalchemy.exc import OperationalError 
 
from ..models import MyModel, Subject, Contact, 
from ..models.meta import   Base, 
 
 
def setup_models(dbsession)  : 
    """ 
    Add or update models / fixtures in the database. 
 
    """ 
    model = MyModel(name='one', value=1) 
    dbsession.add(model) 
 
        for subject_name in ('Python', 'Pyramid', 'Pygame'): 
            model = Subject(name=subject_name) 
            dbsession.add(model) ...

Para ir más allá

Se han presentado aquí los fundamentos que permiten crear un sitio web a partir de un framework minimalista en Python 3. Haría falta un libro entero dedicado a este tema, pues las competencias necesarias son enormes: Pyramid permite hacer muchas más cosas que las que se han presentado aquí y requiere una verdadera inversión de tiempo, sin hablar de las tecnologías HTML, CSS, JavaScript, asociadas a perfiles de diseñadores gráficos y de ergonomía.

Esta presentación puede, también, completarse con otros temas potencialmente complejos como, por ejemplo, la gestión correcta de los usuarios y de los grupos, la autenticación mediante LDAP, los grupos LDAP, la gestión de openID, el uso de varias bases de datos o la implementación de herramientas de profiling.

Por último, para finalizar, cuando se pone en producción una aplicación de estas características, conviene utilizar un servidor como Apache, Gunicorn, Tornado o NGINX y, por tanto, WSGI. Esto se lleva a cabo muy rápidamente y de manera sencilla; gracias a los hosts virtuales es posible integrar esta aplicación en un pool de aplicaciones que se ejecuten en un mismo servidor.

Cabe tener en cuenta que Pyramid no es la única solución y que para realizar ciertas funcionalidades es necesario invocar a otros módulos Python, no todos ellos...