Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <!doctype html>
  2. <html lang=fr>
  3. <head>
  4. <!-- Always define the charset before the title -->
  5. <meta charset=utf-8>
  6. <title>Comparaison de TurboGears et Django, deux frameworks web Python — Biologeek — David Larlet</title>
  7. <!-- Define a viewport to mobile devices to use - telling the browser to assume that the page is as wide as the device (width=device-width) and setting the initial page zoom level to be 1 (initial-scale=1.0) -->
  8. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  9. <!-- Fake favicon, to avoid extra request to the server -->
  10. <link rel="icon" href="data:;base64,iVBORw0KGgo=">
  11. <link type="application/atom+xml" rel="alternate" title="Feed" href="/david/log/" />
  12. <link rel="manifest" href="/manifest.json">
  13. <link rel="stylesheet" href="/static/david/css/larlet-david-_J6Rv.css" data-instant-track />
  14. <noscript>
  15. <style type="text/css">
  16. /* Otherwise fonts are loaded by JS for faster initial rendering. See scripts at the bottom. */
  17. body {
  18. font-family: 'EquityTextB', serif;
  19. }
  20. h1, h2, h3, h4, h5, h6, time, nav a, nav a:link, nav a:visited {
  21. font-family: 'EquityCapsB', sans-serif;
  22. font-variant: normal;
  23. }
  24. </style>
  25. </noscript>
  26. <!-- Canonical URL for SEO purposes -->
  27. <link rel="canonical" href="https://larlet.fr/david/biologeek/archives/20060715-comparaison-de-turbogears-et-django-deux-frameworks-web-python">
  28. </head>
  29. <body>
  30. <div>
  31. <header>
  32. <nav>
  33. <p>
  34. <small>
  35. Je suis <a href="/david/" title="Profil public">David Larlet</a>, <a href="/david/pro/" title="Activité professionnelle">artisan</a> du web qui vous <a href="/david/pro/accompagnement/" title="Activité d’accompagnement">accompagne</a><span class="more-infos"> dans l’acquisition de savoirs pour concevoir des <a href="/david/pro/produits-essentiels/" title="Qu’est-ce qu’un produit essentiel ?">produits essentiels</a></span>. <span class="more-more-infos">Discutons ensemble d’une <a href="/david/pro/devis/" title="En savoir plus">non-demande de devis</a>.</span> Je partage ici mes <a href="/david/blog/" title="Expériences bienveillantes">réflexions</a> et <a href="/david/correspondances/2017/" title="Lettres hebdomadaires">correspondances</a>.
  36. </small>
  37. </p>
  38. </nav>
  39. </header>
  40. <section>
  41. <h1 property="schema:name">Comparaison de TurboGears et Django, deux frameworks web Python</h1>
  42. <article typeof="schema:BlogPosting">
  43. <div property="schema:articleBody">
  44. <img src="/static/david/biologeek/images/logos/turbogears_django.png" alt="vignette" style="float:left; margin: 0.5em 1em;" property="schema:thumbnailUrl" />
  45. <p>Entre deux <a href="https://larlet.fr/david/biologeek/archives/20060617-traduction-francaise-de-la-documentation-de-django-le-framework-web-python/">traductions de tutoriels pour Django</a>, j'ai décidé de traduire ce <a href="http://www-128.ibm.com/developerworks/linux/library/l-turbogears/#N10403">petit comparatif</a> qui fait suite aux articles d'introduction à ces frameworks web publiés sur le site d'IBM (<a href="http://www-128.ibm.com/developerworks/linux/library/l-django/">partie 1 consacrée à Django</a> et <a href="http://www-128.ibm.com/developerworks/linux/library/l-turbogears/">partie 2 à TurboGears</a>). Je trouve que c'est l'un des plus objectifs qui m'ait été donné de lire et il est à ce titre intéressant pour ceux qui sont dans le doute et/ou curieux.</p>
  46. <p><a href="http://www.djangoproject.com/">Django</a> et <a href="http://www.turbogears.org/">TurboGears</a> sont deux frameworks de type <abbr title="Modèle Vue Contrôleur">MVC</abbr> qui permettent de développer des sites Web de manière agile et rapide en utilisant le langage Python. De façon à choisir celui qui répondra le mieux à vos besoins, voici quelques différences à connaître&nbsp;:</p>
  47. <h2>Historique</h2>
  48. <p>Les deux projets, tout comme Ruby on Rails, sont issus d'applications existantes ayant été ensuite «&nbsp;libérées » pour la communauté Open Source. Django est plus vieux et provient, à la base, d'un journal en ligne qui sert des millions de pages par jour. TurboGears est issu du développement d'un client riche, une application de lecture de flux <abbr title="RDF Site Summary">RSS</abbr> qui est toujours en développement. Par rapport à Django, TurboGears est davantage guidé par la communauté car il utilise de nombreux composants open-source pré-existants.</p>
  49. <p>Les origines différentes de chaque projet ont mené à des priorités différentes lors du développement. L'équipe de Django, venant du monde en constante évolution du journalisme en ligne, s'est focalisée sur un framework permettant de bâtir rapidemment des applications facilement modifiables et basées sur du contenu. L'équipe de TurboGears, avec ses origines de produit-consommateur, s'est dirigée vers des applications client riches et une architecture modulaire.</p>
  50. <h2>URLs</h2>
  51. <p>Le mécanisme de gestion des requêtes de Django correspond aux contrôleurs de classes et aux noms de méthodes. Dès que vous ajoutez une nouvelle classe ou une nouvelle méthode, la nouvelle URL est immédiatement disponible. Si vous avez besoin de changer le chemin qui execute un contrôleur donné, vous devez modifier la structure de votre code. Réciproquement, Django utilise un fichier de configuration indépendant basé sur des expressions rationnelles. Celui-ci fait correspondre les URLs au code, découplant la structure des URLs de l'implémentation.</p>
  52. <p>Le système de TurboGears est plus rapide à mettre en place que celui de Django, puiqu'il ne nécessite qu'un simple décorateur pour rendre les nouvelles pages disponibles. Par contre, le système de configuration de Django permet un contrôle et une flexibilité totale. Les URLs de Django peuvent être facilement rétablies pour une application après un réarrangement majeur du code. Cela permet de prévenir les liens morts causés par les anciens favoris ou le cache des moteurs de recherche. Les liens morts sont à l'origine d'une baisse du traffic et de l'utilisabilité des sites basés sur du contenu auxquels Django est destiné.</p>
  53. <h2>Réutilisation du code</h2>
  54. <p>L'équipe de TurboGears appelle leur projet un méga-framework pour rendre limpide le fait que <abbr title="TurboGears">TG</abbr> est issu de composants existants. L'équipe de TurboGears sélectionne et incorpore le meilleur code source diponible au lieu de tout réécrire à partir de rien. L'un des bénéfice du framework TurboGears est, qu'étant un méga-projet, il dispose d'une méga-communauté. <abbr title="TurboGears">TG</abbr> est devenu un puissant catalyseur, augmentant l'intérêt et la motivation pour les projets formant le cœur de TurboGears.</p>
  55. <p>À l'inverse, Django a été créé en 2003 lorsque l'état des composants Python existants n'était pas aussi avancé que ce qu'il est aujourd'hui. Le framework Django a été créé à partir de rien, et le resultat est un framework stable qui est utilisé pour de nombreux sites qui gèrent des millions de clics par jour. Toutefois, certains avancent que le projet Django souffre du syndrome du <abbr title="Not Invented Here">NIH</abbr> (réinvention de la roue) en raison de son manque de réutilisation du code. La position de l'équipe de Django est que le travail nécessaire pour créer un framework en Python à partir de rien n'est pas plus important que celui d'adapter les composants existants ensemble et que le résultat est un framework uniformisé et cohérent.</p>
  56. <h2>JavaScript</h2>
  57. <p>TurboGears a donné à la bibliothèque JavaScript MochiKit une position de premier choix au sein de son framework. L'équipe a aussi créé une bibliothèque de composants qui permet l'utilisation étendue du JavaScript pour créer des éléments d'interfaces «&nbsp;enrichies ». Cela montre l'importance attribuée au développement de clients riches (Ajax) dans le monde de TurboGears. L'équipe de Django n'a pas choisie de bibliothèque JavaScript particulière inclue dans leur framework par défaut mais a discuté de cette possibilité (<abbr title="Note du Traducteur">NdT</abbr>&nbsp;: c'est <a href="http://code.djangoproject.com/wiki/AJAX">toujours en cours de discussion</a>). Aucun des projets ne vous restreint, d'aucune façon que ce soit, à utiliser la bibliothèque JavaScript de votre choix.</p>
  58. <h2>Outils d'administration</h2>
  59. <p>Les deux projets ont une interface d'administration. L'outil d'aministration de Django est destiné à l'utilisateur final qui a besoin d'une interface ergonomique d'insertion des données ne nécessitant pas d'être modifiée à chaque ajout de nouvelle fonctionnalité. En revanche, l'outil d'aministration de TurboGears est destiné aux développeurs. Elle leur permet d'avoir accès à divers outils dont un visualisateur et un éditeur de base de données basiques.</p>
  60. <h2>Licence</h2>
  61. <p>Du fait que Django soit parti de rien, l'intégralité du projet est sous une unique licence open source (le licence BSD). TurboGears, issu de plusieurs projets, a plusieurs licences. SQLObject, l'outil d'<abbr title="Object Relational Mapping">ORM</abbr>, est protégé par la <abbr title="Lesser General Public License">LGPL</abbr>, qui stipule que chaque modification directe de SQLObject doit être restituée à la communauté du projet. La licence ne nécessite pas que les application l'utilisant soient open source. Néanmoins, certaines sociétés n'acceptent pas l'utilisation de logiciels sous <abbr title="Lesser General Public License">LGPL</abbr>. Dans ce cas, vous pouvez utiliser SQLAlchemy, un autre outil d'<abbr title="Object Relational Mapping">ORM</abbr> bénéficiant d'un support important au sein de la communauté de <abbr title="TurboGears">TG</abbr>.</p>
  62. <h2>Exemples concrêts</h2>
  63. <p>Consultez la liste des <a href="http://code.djangoproject.com/wiki/DjangoPoweredSites">sites propulsés par Django</a> et <a href="http://trac.turbogears.org/turbogears/wiki/SitesUsingTurboGears">TurboGears</a>. Ces applications en ligne témoignent de ce qui peut être fait avec chacun de ces outils.</p>
  64. <h2>Bonus</h2>
  65. <p>On n'est plus dans la traduction mais si vous vous intéressez aussi à <abbr title="Ruby on Rails">RoR</abbr> je vous recommande <a href="http://www.djangoproject.com/snakesandrubies/">cette vidéo</a> qui date un peu (donc les exemples sont légèrement obsolètes) mais qui se termine par une séance de questions/réponses intéressante et plutôt marrante (pour les geeks). De toute façon, maintenant qu'on sait que <a href="http://wiki.rubyonrails.com/rails/pages/Framework+Performance">Django est plus performant que Rails</a>... je ne vois plus trop d'intérêt à apprendre le ruby ;-).</p>
  66. </div>
  67. </article>
  68. <footer>
  69. <h6 property="schema:datePublished">— 15/07/2006</h6>
  70. </footer>
  71. </section>
  72. <section>
  73. <div>
  74. <h3>Articles peut-être en rapport</h3>
  75. <ul>
  76. <li><a href="/david/biologeek/archives/20060815-le-langage-de-template-django-pour-les-auteurs-de-templates/" title="Accès à Le langage de template Django : Pour les auteurs de templates">Le langage de template Django : Pour les auteurs de templates</a></li>
  77. <li><a href="/david/biologeek/archives/20060617-redaction-de-votre-premiere-appli-django-partie-4-conception-d-un-formulaire-et-vues-generiques/" title="Accès à Rédaction de votre première appli Django, partie 4 : Conception d&#39;un formulaire et vues génériques">Rédaction de votre première appli Django, partie 4 : Conception d&#39;un formulaire et vues génériques</a></li>
  78. <li><a href="/david/biologeek/archives/20060617-redaction-de-votre-premiere-appli-django-partie-3-creation-des-vues-de-l-interface-publique/" title="Accès à Rédaction de votre première appli Django, partie 3 : Création des vues de l&#39;interface publique">Rédaction de votre première appli Django, partie 3 : Création des vues de l&#39;interface publique</a></li>
  79. </ul>
  80. </div>
  81. </section>
  82. <section>
  83. <div id="comments">
  84. <h3>Commentaires</h3>
  85. <div class="comment" typeof="schema:UserComments">
  86. <p class="comment-meta">
  87. <span class="comment-author" property="schema:creator">fredix</span> le <span class="comment-date" property="schema:commentTime">15/07/2006</span> :
  88. </p>
  89. <div class="comment-content" property="schema:commentText">
  90. <p>&quot;De toute façon, maintenant qu'on sait que Django est plus performant que Rails... je ne vois plus trop d'intérêt à apprendre le ruby ;-).&quot;<br />
  91. <br />
  92. Pas pour longtemps ;) :<br />
  93. <a href="http://www.ruby-forum.com/topic/72785" title="http://www.ruby-forum.com/topic/72785" rel="nofollow">www.ruby-forum.com/topic/...</a></p>
  94. </div>
  95. </div>
  96. <div class="comment" typeof="schema:UserComments">
  97. <p class="comment-meta">
  98. <span class="comment-author" property="schema:creator">Actinidia</span> le <span class="comment-date" property="schema:commentTime">26/07/2006</span> :
  99. </p>
  100. <div class="comment-content" property="schema:commentText">
  101. <!-- TB -->
  102. <p><strong>Développement web agile: quel framework choisir ?</strong></p>
  103. <p>La mode en ce moment est au framework de développement web basés sur les langages de script Python et Ruby on Rails. Trois framework semblent se démarquer (les sites web officiels des trois projets valent le coup d'oeil):
  104. Ruby on Rails, en Ruby...</p>
  105. </div>
  106. </div>
  107. <div class="comment" typeof="schema:UserComments">
  108. <p class="comment-meta">
  109. <span class="comment-author" property="schema:creator">Bader</span> le <span class="comment-date" property="schema:commentTime">01/09/2006</span> :
  110. </p>
  111. <div class="comment-content" property="schema:commentText">
  112. <p>Quelques précisions en ce qui concerne TG:<br />
  113. <br />
  114. TG dispose d'un système de package automatisé: les eggs qui sont le standard python. Il est ainsi facile de distribuer une application;<br />
  115. Grace à ça, on peut développer des widgets pour TG que l'on distribuera sous forme de egg.<br />
  116. <br />
  117. De plus TG permet d'utiliser le modèle créé et donc la base de donnée en dehors de TG et sans même ce dernier tout en gardant l'interface objet de l'ORM.<br />
  118. <br />
  119. Il est tout à fait possible avec TG comme avec Django de définir les urls tels qu'on le souhaite. Par défaut il suffit de rajouter un décorateur pour publier une url mais il existe un module appelé RulesDispatch pour gérer plus librement l'URL. De plus il existe un mécanisme interne à CherryPy permettant de gérer soit même son url, il s'agit de la méthode default qui est appelée lorsqu'aucun objet ou méthode exposée n'est trouvée.<br />
  120. <br />
  121. Sinon ton article est très bien :D</p>
  122. </div>
  123. </div>
  124. <div class="comment" typeof="schema:UserComments">
  125. <p class="comment-meta">
  126. <span class="comment-author" property="schema:creator">Baptistoux</span> le <span class="comment-date" property="schema:commentTime">11/01/2007</span> :
  127. </p>
  128. <div class="comment-content" property="schema:commentText">
  129. <p>&quot;TG dispose d'un système de package automatisé: les eggs qui sont le standard python. Il est ainsi facile de distribuer une application;&quot;<br />
  130. <br />
  131. Ruby on Rails (et plus généralement Ruby) permet aussi cela :<br />
  132. les gems ;-)</p>
  133. </div>
  134. </div>
  135. <div class="comment" typeof="schema:UserComments">
  136. <p class="comment-meta">
  137. <span class="comment-author" property="schema:creator">patrick32</span> le <span class="comment-date" property="schema:commentTime">12/09/2007</span> :
  138. </p>
  139. <div class="comment-content" property="schema:commentText">
  140. <p><a href="http://trac.turbogears.org/turbogears/wiki/SitesUsingTurboGears" title="http://trac.turbogears.org/turbogears/wiki/SitesUsingTurboGears" rel="nofollow">trac.turbogears.org/turbo...</a><br />
  141. This page has been migrated too <a href="http://docs.turbogears.org/SitesUsingTurboGears" title="http://docs.turbogears.org/SitesUsingTurboGears" rel="nofollow">docs.turbogears.org/Sites...</a></p>
  142. </div>
  143. </div>
  144. <div class="comment" typeof="schema:UserComments">
  145. <p class="comment-meta">
  146. <span class="comment-author" property="schema:creator">dju-</span> le <span class="comment-date" property="schema:commentTime">18/08/2011</span> :
  147. </p>
  148. <div class="comment-content" property="schema:commentText">
  149. <p>L&#39;article est très vieux, mais bon... comme le lien est encore cassé, hop : <a href="http://www.turbogears.org/en/whos-using">http://www.turbogears.org/en/whos-using</a> :S</p>
  150. </div>
  151. </div>
  152. </div>
  153. </section>
  154. <footer>
  155. <nav>
  156. <p>
  157. <small>
  158. Je réponds quasiment toujours aux <a href="m&#x61;ilto:d&#x61;vid%40l&#x61;rlet&#46;fr" title="Envoyer un email">emails</a> (<a href="/david/signature/" title="Ma signature actuelle avec possibilité de chiffrement">signés</a>) et vous pouvez me rencontrer à Montréal. <span class="more-infos">N’hésitez pas à <a href="/david/log/" title="Être tenu informé des mises à jour">vous abonner</a> pour être tenu informé des publications récentes.</span>
  159. </small>
  160. </p>
  161. </nav>
  162. </footer>
  163. </div>
  164. <script src="/static/david/js/larlet-david-3ee43f.js" data-no-instant></script>
  165. <script data-no-instant>InstantClick.init()</script>
  166. </body>
  167. </html>