Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Créer une application console en 10 minutes

Objectif

L’objectif de ce chapitre est de présenter une application console qui s’appuie sur le travail réalisé au chapitre précédent puisque l’on va réutiliser la base de données créée, mais également toute la partie modèle.

L’objectif est d’initier un programme qui réalise la saisie d’un contact de manière rapide, en saisissant les arguments directement dans la ligne de commande.

Contrairement à un site web, une application console a une interaction limitée avec l’utilisateur. Il n’existe pas d’interface humaine évoluée, pas de formulaire à présenter. On se contente de prendre des paramètres et d’afficher un message en cas d’erreur.

On va créer cette application de la manière la plus simple possible, c’est-à-dire en réutilisant le modèle déjà créé et en sécurisant les données saisies par l’utilisation du module argparse. On pourra imaginer, dans un second temps, utiliser l’entrée standard pour de la saisie, ou créer un autre programme pour afficher les contacts existants, par exemple, mais ceci est hors du cadre de ce chapitre.

Nous choisissons d’appeler notre application console avec ces paramètres :

$ contact development.ini moi@maison.org Python "Mon message" 

Le premier argument désigne le fichier de configuration de l’application. Viennent ensuite le courriel, le sujet et le message.

Enregistrer le script

La première tâche consiste à enregistrer cette nouvelle application. Pour cela, il faut modifier le fichier pyproject.toml ainsi :

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

Pour garder la compatibilité avec l’ancien système de packaging, on peut également modifier le fichier setup.py, en y rajoutant la ligne en gras :

setup(name='contact',  
     version='0.0',  
     description='contact', 
     [...] 
     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", 
           "contact = project.scripts.contact:main", 
        ], 
    },  
     ) 

On rajoute ainsi à l’application un nouveau point d’entrée, qui désigne la fonction main du module contact, situé dans le répertoire script (à coté...

Création des données

Ensuite, il faut créer ce fichier contact.py et y rajouter la fonction principale, celle qui fait le travail :

def contact(dbsession, email, subject, text): 
   """Add a contact""" 
   obj = dbsession.query(Subject).filter_by(name=subject).first() 
   if not obj: 
       print('Pick a subject in this list:') 
       for obj in dbsession.query(Subject).all(): 
           print('> %s' % obj.name) 
       print('Try again.') 
       return 
   with transaction.manager: 
       dbsession.add(Contact(email=email, subject_id=obj.id, text=text)) 

Cette fonction a besoin d’une session fonctionnelle et des trois arguments utiles pour créer la donnée.

Il est important de noter que, pour une application console simple, il n’existe pas l’équivalent d’une liste de sélection en Web. Aussi, on a choisi ici de nommer le sujet, et d’aller le chercher en base. S’il n’existe pas, alors on n’insère pas la donnée et on affiche un message d’erreur. On aurait tout aussi bien pu choisir de l’ajouter s’il n’existe pas, mais on a choisi ici de garder un comportement similaire à ce qu’il se passe en Web.

Si le programme échoue, l’utilisateur peut toujours rappeler la commande à l’aide de l’historique et modifier uniquement le sujet pour choisir le bon.

À noter qu’il est aussi possible d’utiliser curse, mais dans ce cas-là on dépasserait les dix minutes et ceci n’est qu’une introduction....

Parseur d’arguments

Il faut créer un simple parseur qui prend en charge la création d’un contact.

Voici ce parseur :

def get_parser(): 
   # Étape 1 : définir une fonction proxy vers la fonction principale 
   def proxy_contact(args): 
       """Fonction proxy vers contact""" 
       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('Message d'erreur identique à initialize_db.py') 
 
   # Étape 2 : définir l'analyseur général 
   parser = argparse.ArgumentParser( 
       prog = 'contact', 
       description = """Programme permettant de rajouter un Contact""", 
       epilog = """Réalisé pour le livre Python, les fondamentaux du 
langage""" 
   ) 
   # Rajout des options utiles 
   parser.add_argument( 
       'config_uri', ...