<?xml version="1.0"?>
<rss xmlns:php="http://php.net/xsl" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Premiers pas avec Pyramid - Chicoree</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid</link><atom:link href="http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid?action=toFeed" rel="self" type="application/rss+xml"/><description><![CDATA[À en croire Google Trend, dans le monde du développement Web avec Python, Django se taille la part du lion. Mais des alternatives existent. C'est justement à l'une de ces alternatives que je vais m'intéresser aujourd'hui. À l'occasion d'un (tout) petit projet d'initiation à la programmation Web je vais donc vous montrer comment mettre en œuvre Pyramid.
]]></description><item><title>1 Le projet</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Le_projet</link><description><![CDATA[<p>Le projet qui me sert de support ici est un embryon de système de gestion de stock. Outre l'écran de connexion (<i>login</i>), l'application comporte deux pages: une page permet de saisir un code <a>EAN13</a> (au clavier ou à l'aide d'une <i>douchette</i> émulant un clavier) ainsi qu'une description associée. Une autre page permet de visualiser la liste des entrées saisies.
</p>]]></description></item><item><title>2 Installer les outils</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Installer_les_outils</link><description><![CDATA[<p>Il est recommandé d'utiliser Pyramid au travers d'un environnement Python virtuel. L'argument principal en faveur de ce choix est que, pendant le cycle de développement, vous allez être amené à installer différents modules avec <a>easy_install</a> (y compris <i>notre</i> application). Par conséquent vous devrez avoir les permissions en écriture sur les dossiers correspondants:
</p>]]></description></item><item><title>2.1 Pyramid</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Pyramid</link><description><![CDATA[<p>Il est recommandé d'utiliser Pyramid au travers d'un environnement Python virtuel. L'argument principal en faveur de ce choix est que, pendant le cycle de développement, vous allez être amené à installer différents modules avec <a>easy_install</a> (y compris <i>notre</i> application). Par conséquent vous devrez avoir les permissions en écriture sur les dossiers correspondants:
</p>]]></description></item><item><title>2.2 MariaDB</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#MariaDB</link><description><![CDATA[<p>Je suppose ici que MariaDB (ou MySQL) est déjà installé sur la machine qui servira de serveur de bases de données. Je ne m'étend pas sur le processus car il est la plupart du temps trivial — et sous Debian se limite le plus souvent à installer le paquet correspondant.
</p>]]></description></item><item><title>3 Cycle de développement avec Pyramid</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Cycle_de_d.C3.A9veloppement_avec_Pyramid</link><description><![CDATA[<p>Le manuel d'introduction de Pyramid explique très clairement comment il est possible de <a>créer une première application "à la main"</a>. Mais dans la pratique, il est nettement plus productif de partir d'un squelette de projet généré par Pyramid (<i><a>scaffold</a></i>). Ici, comme j'ai l'intention d'utiliser <a>SQLAlchemy</a> comme couche d'abstraction pour l'accès à la base de données, je vais utiliser le modèle correspondant:
</p>]]></description></item><item><title>3.1 Créer le projet</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Cr.C3.A9er_le_projet</link><description><![CDATA[<p>Le manuel d'introduction de Pyramid explique très clairement comment il est possible de <a>créer une première application "à la main"</a>. Mais dans la pratique, il est nettement plus productif de partir d'un squelette de projet généré par Pyramid (<i><a>scaffold</a></i>). Ici, comme j'ai l'intention d'utiliser <a>SQLAlchemy</a> comme couche d'abstraction pour l'accès à la base de données, je vais utiliser le modèle correspondant:
</p>]]></description></item><item><title>3.2 Lancer les tests unitaires</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Lancer_les_tests_unitaires</link><description><![CDATA[<p>Le script <tt>setup.py</tt> à la racine du projet permet de lancer le jeu de tests unitaires de l'application:
</p>]]></description></item><item><title>3.3 Lancer l'application</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Lancer_l.27application</link><description><![CDATA[<p>Pour lancer l'application Pyramid, il faut d'abord l'installer. Comme pour les tests, cela se fait à l'aide du script <tt>setup.py</tt>. Ensuite, il faut lancer le serveur WSGI qui permettra de répondre aux requêtes <i>http</i>. Pour cela Pyramid fournit l'utilitaire <tt>pserve</tt>:
</p>]]></description></item><item><title>3.4 Modifier la configuration du projet</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Modifier_la_configuration_du_projet</link><description><![CDATA[<p>Pour la version de développement, la configuration du projet se trouve dans le fichier <tt>development.ini</tt>. Ici, je vais faire deux changements:
</p>]]></description></item><item><title>3.4.1 Changer la configuration du serveur WSGI</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Changer_la_configuration_du_serveur_WSGI</link><description><![CDATA[<p>Dans le fichier <tt>development.ini</tt> il faut trouver la section <tt>[server:main]</tt> qui se charge de la configuration du réseau. Dans sa version par défaut, cette section contient les options suivantes:
</p>]]></description></item><item><title>3.4.2 Changer la configuration d'accès à la base de données</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Changer_la_configuration_d.27acc.C3.A8s_.C3.A0_la_base_de_donn.C3.A9es</link><description><![CDATA[<p>Pour modifier les paramètres de connection à la base de données, il faut altérer l'option <tt>sqlalchery.url</tt> de la section <tt>[app:main]</tt>. Par défaut, les applications utilisant SQLAlchemy sont adossées à une base SQLLite:
</p>]]></description></item><item><title>3.5 Ajouter des dépendances</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Ajouter_des_d.C3.A9pendances</link><description><![CDATA[<p>Je l'ai dit dans la section précédente, je vais utiliser <i>PyMySQL</i> comme pilote pour accéder à la base MariaDB. C'est à dire que pour fonctionner, mon application va nécessiter ce module supplémentaire. À la fois en version de développement mais aussi en production. Il est donc inimaginable de simplement installer "à la main" le module nécessaire <i>localement</i>. Il est vital d'automatiser ce processus. Tout cela pour dire que nous allons ajouter cette nouvelle dépendance au script <tt>setup.py</tt> situé à la racine du projet:
</p>]]></description></item><item><title>3.6 Initialiser la base de données</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Initialiser_la_base_de_donn.C3.A9es</link><description><![CDATA[<p>À ce stade, nous avons rassemblé toutes les briques nécessaires à notre application. La toute dernière étape avant de pouvoir (enfin) tester l'application par défaut va être <i>d'initialiser</i> la base de données.
</p>]]></description></item><item><title>4 Créer les modèles...</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Cr.C3.A9er_les_mod.C3.A8les...</link><description><![CDATA[<p>Tout d'abord, nous allons créer la table des utilisateurs qui nous servira pour authentifier les accès à l'application. Ici, je vais créer et peupler manuellement la table dans MariaDB. Ce n'est pas nécessairement la manière recommandée de procéder, mais c'est un scénario très plausible: on pourrait facilement imaginer qu'il s'agit d'une table déjà existante gérée par une application tierce. Même si notre application n'est qu'un jouet développé pour le besoin de ce tutoriel, je vais quand même stocker les mots de passe sous forme de hash pour ne pas encourager les mauvaises pratiques.
</p>]]></description></item><item><title>4.1 ... à la main</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#..._.C3.A0_la_main</link><description><![CDATA[<p>Tout d'abord, nous allons créer la table des utilisateurs qui nous servira pour authentifier les accès à l'application. Ici, je vais créer et peupler manuellement la table dans MariaDB. Ce n'est pas nécessairement la manière recommandée de procéder, mais c'est un scénario très plausible: on pourrait facilement imaginer qu'il s'agit d'une table déjà existante gérée par une application tierce. Même si notre application n'est qu'un jouet développé pour le besoin de ce tutoriel, je vais quand même stocker les mots de passe sous forme de hash pour ne pas encourager les mauvaises pratiques.
</p>]]></description></item><item><title>4.2 ... à partir de Python</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#..._.C3.A0_partir_de_Python</link><description><![CDATA[<p>Notre application Pyramid va utiliser l'<span>ORM<span> (</span><span><i><a>Object-relational mapping</a></i><span>) </span></span></span> SQLAlchemy. Concrètement, cela veut dire que l'on peut définir le modèle de données objet à partir du langage de programmation (éventuellement en utilisant l'héritage ou la composition) et que le framework va prendre en charge <i>automagiquement</i> la conversion depuis (ou vers) le modèle relationnel de la base de données. Bref, vous écrivez du Python, pas du SQL.
</p>]]></description></item><item><title>5 Je veux voir quelque-chose ...</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Je_veux_voir_quelque-chose_...</link><description><![CDATA[<p>Un concept simple mais important dans le <i>framework</i> Pyramid est celui de <i>route</i>. Une <i>route</i> permet l'association entre une URL et une vue (une <i>"page"</i>). Chaque route possède un nom. Notre application contient trois pages. Qui vont ici correspondre à trois routes. Cependant, pour éviter les répétitions, Pyramid nous permet de créer des routes <i>dynamiques</i> à partir de motifs. Ici, je vais donc ajouter les routes suivantes au fichier <tt>PyramidDemo/pyramiddemo/__init__.py</tt>:
</p>]]></description></item><item><title>5.1 ... mais j'ai perdu ma route</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#..._mais_j.27ai_perdu_ma_route</link><description><![CDATA[<p>Un concept simple mais important dans le <i>framework</i> Pyramid est celui de <i>route</i>. Une <i>route</i> permet l'association entre une URL et une vue (une <i>"page"</i>). Chaque route possède un nom. Notre application contient trois pages. Qui vont ici correspondre à trois routes. Cependant, pour éviter les répétitions, Pyramid nous permet de créer des routes <i>dynamiques</i> à partir de motifs. Ici, je vais donc ajouter les routes suivantes au fichier <tt>PyramidDemo/pyramiddemo/__init__.py</tt>:
</p>]]></description></item><item><title>5.2 La vue de connexion (login)</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#La_vue_de_connexion_.28login.29</link><description><![CDATA[<p>Enfin, nous allons pouvoir créer nos pages. Pyramid offre pour cela en standard plusieurs alternatives. Dont les moteurs de template <a>Mako</a> et <a>Chameleon</a>. Ce dernier est le moteur de template par défaut et c'est lui que je vais utiliser. Je vous livre directement le code de <tt>pyramiddemo/templates/login.pt</tt>:
</p>]]></description></item><item><title>5.3 Authentification et autorisation</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Authentification_et_autorisation</link><description><![CDATA[<p>Ce sont deux concepts liés, mais clairement séparés dans Pyramid afin d'offrir un maximum de souplesse dans leur mise en œuvre:
</p>]]></description></item><item><title>5.4 Connecter tout ensemble</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Connecter_tout_ensemble</link><description><![CDATA[<p>Presque. Nous y sommes presque. L'infrastructure de "sécurité" est en place. Le modèle pour la page web de connexion est écrit. La route pour accéder à la page est définie. Reste seulement à ajouter les quelques lignes de logique applicative en Python pour générer la vue et répondre à la saisie du formulaire. Cela se fait dans le fichier <tt>PyramidDemo/pyramiddemo/views.py</tt>. Ici, je vous donne l'<i>intégralité</i> du fichier car nous avons une fonction à ajouter mais aussi pas mal de ménage à faire pour supprimer la page principale par défaut générée lors de la création du projet. Rassurez-vous l'ensemble du code <i>imports</i> compris prend moins de 40 lignes:
</p>]]></description></item><item><title>6 Ajouter d'autres vues</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Ajouter_d.27autres_vues</link><description><![CDATA[<p>Après la longue section consacrée à la page de connexion, la création de la vue qui permet de visualiser les données de la table <tt>ITEMS</tt> va vous sembler assez reposante. Tout d'abord, jetons un œil au modèle Chameleon associé <tt>PyramidDemo/pyramiddemo/templates/item_view.pt</tt>:
</p>]]></description></item><item><title>6.1 La vue /item/view</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#La_vue_.2Fitem.2Fview</link><description><![CDATA[<p>Après la longue section consacrée à la page de connexion, la création de la vue qui permet de visualiser les données de la table <tt>ITEMS</tt> va vous sembler assez reposante. Tout d'abord, jetons un œil au modèle Chameleon associé <tt>PyramidDemo/pyramiddemo/templates/item_view.pt</tt>:
</p>]]></description></item><item><title>6.2 La vue /item/add</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#La_vue_.2Fitem.2Fadd</link><description><![CDATA[<p>Celle-ci est <i>vraiment</i> simple. Il suffit de créer le modèle Chameleon, puis de rajouter le code Python pour gérer cette vue et répondre au formulaire. Voici tout d'abord le contenu <i>intégral</i> de <tt>PyramidDemo/pyramiddemo/templates/item_add.pt</tt>. Vous le verrez, il n'y a rien de nouveau dans ce code par rapport à nos exemples précédents:
</p>]]></description></item><item><title>7 Tester</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Tester</link><description><![CDATA[<p>Le <i>framework</i> <a>Pyramid supporte à la fois les  tests unitaires, les tests d'intégration et les tests fonctionnels</a> à l'aide de fonction qui viennent compléter le module Python standard <tt>unittest</tt>.
</p>]]></description></item><item><title>8 Conclusion</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Conclusion</link><description><![CDATA[<p>Ouf! Même si l'application est relativement simple, son développement nous a quand même demandé un peu de travail. Surtout parce que j'ai pris le temps d'introduire de nombreux concepts clés en route. Par contre, une fois les premières pages réalisées, vous constaterez que l'on peut ensuite ajouter assez rapidement de nouvelles fonctionnalités à l'application sans beaucoup de difficultés. L'outil se révèle souple et est bâti sur des technologies éprouvées et interchangeables (SQLAlchemy, Chameleon, Mako...) C'est à la fois son point fort, puisque Pyramid ne vous impose finalement pas grand chose. Mais c'est peut-être aussi un écueil dans les premiers temps, puisqu'il faut souvent jongler avec les documentations de différents logiciels pour résoudre un problème.
</p>]]></description></item><item><title>9 Ressources</title><link>http://www.chicoree.fr/w/Premiers_pas_avec_Pyramid#Ressources</link><description/></item></channel></rss>
