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í

Crear una aplicación de consola en 10 minutos

Objetivo

El objetivo de este capítulo es presentar una aplicación de consola basada en el trabajo realizado en el capítulo anterior, pues vamos a reutilizar la base de datos creada, así como toda la parte correspondiente al modelo.

El objetivo es iniciar un programa que permita introducir un contacto de forma rápida, escribiendo los argumentos directamente por línea de comandos.

A diferencia de un sitio web, una aplicación de consola tiene una interacción limitada con el usuario. No existe una interfaz de usuario avanzada, ni un formulario para presentar. Se contenta con recibir los parámetros y mostrar un mensaje en caso de error.

Crearemos esta aplicación de la manera más sencilla posible, es decir, reutilizando el modelo ya existente y dotando de seguridad a los datos introducidos mediante un módulo argparse. Como puede imaginarse, en una segunda etapa, es posible utilizar la entrada estándar para escribir los datos, o crear un programa para mostrar los contactos existentes, por ejemplo, aunque esto se sale del marco y el alcance de este capítulo.

Llamaremos a nuestra aplicación de consola con los siguientes parámetros:

$ contacto desarrollo.ini yo@casa.org Python "Mi mensaje" 

El primer argumento designa el archivo de configuración de la aplicación. A continuación, se escribe el correo electrónico, el asunto y el mensaje.

Registrar el script

La primera tarea consiste en registrar esta aplicación nueva. Para ello, hay que modificar el archivo pyproject.toml de la siguiente manera:

[tool.poetry.plugins."console_scripts"] 
initialize_project_db = "project.scripts.initialize_db:main" 
show_settings = "project.scripts.settings:main" 
contact = "project.scripts.contact:main" 

Para conservar la compatibilidad con el sistema antiguo de empaquetado, también se puede modificar el archivo setup.py añadiéndole la línea en negrita:

setup(name='contacto', 
     version='0.0',   
     description='contacto', 
     [...] 
     install_requires=requires, 
     entry_points= 
        "paste.app_factory": [ 
           "main = project:main", 
        ],  
        "console_scripts": [ 
           "initialize_project_db = project.scripts.initialize_db:main", 
           "show_settings = project.scripts.settings:main", 
           "contacto...

Creación de los datos

A continuación, es preciso crear el archivo contacto.py y agregar la función principal, que realiza el trabajo:

def contacto(dbsession, email, subject, text): 
   """Agregar un contacto"""  
   obj = dbsession.query(Subject).filter_by(name=subject).first() 
   if not obj:  
       print('Seleccione un asunto de la lista:') 
       for obj in dbsession.query(Subject).all(): 
           print('> %s' % obj.name)  
       print('Pruebe de nuevo.')  
       return 
   with transaction.manager: 
       dbsession.add(Contact(email=email, subject_id=obj.id, text=text)) 

Esta función necesita una sesión funcional y tres argumentos útiles para crear el dato.

Es importante destacar que, para una aplicación de consola sencilla, no existe ningún equivalente a una lista de selección como en la Web. De este modo, es posible seleccionar el asunto, escribiéndolo y buscándolo a continuación en la base de datos. Si no existe, entonces no se inserta el dato y se muestra un mensaje de error. También podríamos haber optado por agregarlo, si no existe, aunque hemos preferido mantener...

Parser de argumentos

Hay que crear un simple parser que se encargue de crear un contacto.

He aquí dicho parser:

def get_parser(): 
   # Etapa 1: definir una función proxy hacia la función principal 
   def proxy_contacto(args): 
       """Función proxy hacia contacto""" 
       setup_logging(args.config_uri) 
       env = bootstrap(args.config_uri) 
 
       try: 
          with env['request'].tm: 
               dbsession = env['request'].dbsession 
               contact(dbsession, args.email, args.subject, args.text) 
       except OperationalError: 
          print('Mensaje de error idéntico a initialize_db.py') 
 
   # Etapa 2: definir el analizador general 
   parser = argparse.ArgumentParser( 
       prog = 'contacto', 
       description = """Programa que permite agregar un Contacto""", ...