Examen: 13 frameworks Web Python comparés

Si vous développez une application Web et que vous avez choisi Python comme langage pour l'intégrer, c'est une décision intelligente. La maturité de développement de Python, les bibliothèques robustes et l'ampleur de l'adoption dans le monde réel ont contribué à en faire une évidence pour le développement Web.

Vient maintenant la partie la plus difficile: choisir l'un des nombreux frameworks Web Python disponibles. Non seulement le nombre ne cesse de croître, mais il peut être difficile de trouver celui qui correspond le mieux à votre cas d'utilisation. Si vous construisez une API REST rapide et sale, vous n'aurez pas besoin de la plomberie et du câblage requis pour une application complète destinée aux utilisateurs avec des connexions utilisateur, des validations de formulaires et la gestion des téléchargements.

Vidéo connexe: Création d'une application Web simple avec Python et Flask

Dans ce tour d'horizon, nous examinerons 13 des frameworks Web Python les plus largement déployés. Nous noterons les types d'applications Web qui conviennent le mieux à la création et examinerons comment elles se comparent les unes aux autres dans ces six domaines:

Installation: à quel point il est facile ou simple de configurer le cadre - projets qui ne nécessitent pas d'installation formelle (il peut simplement être déposé dans un projet existant en tant que module inclus), nécessitent un minimum de passe-partout pour démarrer, ou sont fournis avec une sorte de la configuration préconfigurée obtiennent des points supplémentaires.

Documentation: Presque tous les projets Python décents ont une documentation qui décrit la configuration, illustre des cas d'utilisation de base et fournit des détails sur les API. Ici, nous accordons des notes plus élevées aux cadres qui montrent comment créer une application entière dans le cadre du didacticiel, incluent des recettes ou des modèles de conception courants, et vont au-delà de l'appel du devoir (par exemple en fournissant des détails sur la façon d'exécuter le framework sous une variante Python comme PyPy ou IronPython).

Gestion: il s'agit d'un score relatif, indiquant la quantité de travail requise pour configurer et maintenir le cadre. Les frameworks minimaux obtiennent des scores plus élevés ici par défaut.

Capacités natives: combien de batteries sont incluses? Des scores plus élevés sont attribués aux frameworks qui fournissent un support natif pour l'internationalisation, la création de modèles HTML et une couche d'accès aux données. Les points vont également aux frameworks qui utilisent nativement la prise en charge native récemment introduite par Python pour les opérations d'E / S asynchrones.

Sécurité: les frameworks qui fournissent des mesures de sécurité natives telles que la protection contre la falsification de demandes intersites (CSRF) et la gestion de session avec des cookies cryptés obtiennent des notes plus élevées.

Évolutivité: la plupart des frameworks Python peuvent utiliser des projets comme Gevent ou Gunicorn pour fonctionner à grande échelle. Ici, nous examinons les fonctionnalités natives du framework qui favorisent l'évolutivité, comme la mise en cache de sortie et de fragment de page.

Si vous êtes curieux de connaître les benchmarks de performance, jetez un œil à la série d'essais en cours de TechEmpower, qui compare plusieurs frameworks Web à travers diverses tâches, avec du code et des méthodologies publiés sur GitHub et soumis à une réévaluation constante. Tous les frameworks de cette discussion ne sont pas analysés ici, mais il est possible d'avoir une bonne idée des frameworks qui fonctionnent le mieux sous quels types de charges.

Nous examinerons 13 cadres en tout. Cinq d'entre eux - CubicWeb, Django, Web2py, Weppy et Zope2 - adoptent l'approche «évier de cuisine», intégrant presque toutes les fonctionnalités dont vous pourriez imaginer avoir besoin pour une application Web. Les huit autres frameworks - Bottle, CherryPy, Falcon, Flask, Pyramid, Tornado, Web.py et Wheezy.web - offrent une prise plus minimaliste, en échangeant le volume et l'exhaustivité pour la simplicité et la facilité.

Commençons par les poids lourds.

Framework Web Python lourds

CubicWeb

CubicWeb est présenté comme «un cadre d'application Web sémantique qui favorise la réutilisation et la conception orientée objet». C'est un système intrigant - comme l'a noté Rick Grehan lorsqu'il l'a examiné en 2011 - qui met l'accent sur l'utilisation d'abstractions et de blocs de construction réutilisables appelés «cubes», mais il peut être trop abstrait ou idiosyncratique pour certains développeurs.

Les cubes sont des composants logiciels qui comportent un schéma (modèle de données), des entités (logique de programmation) et des vues. En assemblant plusieurs cubes, chacun effectuant sa propre tâche, vous pouvez composer des applications logicielles en réutilisant votre propre code et le code des autres.

À la base, CubicWeb fournit un échafaudage de base utilisé par chaque application Web: un «référentiel» pour les connexions et le stockage de données; un «moteur Web» pour les requêtes / réponses HTTP de base et les actions CRUD; et un schéma de modélisation des données. Tout cela est décrit dans les définitions de classe Python. Pour configurer et gérer des instances de CubicWeb, vous travaillez avec un outil de ligne de commande similaire à celui utilisé pour Django.

CubicWeb ne semble pas utiliser la fonctionnalité asynchrone native de Python 3. Une façon détournée d'inclure async serait d'utiliser le module cubicweb.pyramid pour utiliser le framework Pyramid comme serveur Web, et de dessiner sur un fork de Pyramid qui utilise des constructions asynchrones. Mais rien de plus simple semble hors de portée pour le moment.

Pour récupérer ou manipuler des données persistantes dans une application CubicWeb, vous utilisez le langage RQL (Relation Query Language), qui utilise une syntaxe vaguement semblable à SQL, mais qui est calquée sur SparQL du W3C. La justification de CubicWeb pour cela est, encore une fois, l'abstraction: RQL fournit une route hautement découplée pour interconnecter diverses sources de données. Mais comme il est mis en œuvre, en construisant manuellement des requêtes sous forme de chaînes, il semblera probablement obsolète pour les développeurs habitués aux ORM.

Il existe d'autres obstacles à l'utilisation de CubicWeb. D'une part, la configuration peut être un problème. Parce que CubicWeb a beaucoup de dépendances, il est préférable de les utiliser pip installpour toutes les récupérer. Vous devrez peut-être également effectuer une certaine quantité de réglages manuels sur l'environnement local. Ceci est en contraste frappant avec d'autres frameworks où exécuter pip installou déposer le code du framework dans un sous-dossier d'un autre projet est tout ce qui est nécessaire.

Un autre problème potentiel est l'absence d'un moteur de modèle natif; générer du HTML est laissé au développeur. Vous pouvez surmonter ce problème en utilisant un système de modèles tiers tel que Jinja2 ou en optant pour un cube qui fournit des outils pour les interfaces utilisateur Web, comme celui du framework HTML Boostrap.

Un problème de longue date avec CubicWeb - le manque de support Python 3 - a été résolu. Depuis juin 2016 et la version 3.23, la prise en charge de Python 3 a atterri dans CubicWeb, à l'exception des modules comme Twisted qui ne sont pas eux-mêmes entièrement portés.

Comme Web2py, CubicWeb désigne sa longue documentation comme «le livre». Il prend le temps d'expliquer l'approche inhabituelle de CubicWeb, montre comment créer des applications de base, inclut des références d'API et, en général, fait tout son possible pour être précis.

Django

Au cours de la décennie et du changement depuis l'apparition de Django, il est devenu l'un des frameworks Python les plus largement déployés pour créer des applications Web. Django est livré avec la plupart des batteries dont vous pourriez avoir besoin, il est donc plus orienté vers la création de grandes applications que de petites.

Vidéo connexe: Créer un site Web simple avec Django

Après de nombreuses années à passer à la version 1.x, Django a récemment fait un saut de version à gauche de la virgule décimale. Le plus gros changement dans Django 2.0 est que le framework ne fonctionne désormais qu'avec Python 3.4 et plus. Idéalement, vous devriez quand même utiliser Python 3.x, donc la seule raison d'utiliser la branche 1.x de Django est si vous êtes coincé avec une ancienne version de Python.

Un élément clé de l'attrait de Django est la vitesse de déploiement. Parce qu'il comprend autant d'éléments dont vous avez besoin pour développer l'application Web moyenne, vous pouvez agir rapidement. Le routage, l'analyse d'URL, la connectivité de la base de données (y compris un ORM), la validation de formulaire, les protections contre les attaques et la création de modèles sont tous intégrés.

Vous trouverez des blocs de construction pour les scénarios d'application Web les plus courants. La gestion des utilisateurs, par exemple, se trouve sur la plupart des sites Web, donc Django la propose comme un élément standard. Au lieu d'avoir à créer votre propre système pour suivre les comptes d'utilisateurs, les sessions, les mots de passe, les connexions / déconnexions, les autorisations d'administrateur, etc., Django a ces fonctionnalités de manière native. Ils peuvent être utilisés tels quels ou étendus pour englober de nouveaux cas d'utilisation avec un minimum de travail.

zope.formlib 1. Le noyau est BSD; certains composants LGPLv3. 2. Disponible via; installé séparément mais pris en charge dans le cadre du projet. 3. Disponible via une extension tierce.
  CubicWeb Django Web2py Weppy Zope2
Licence LGPL BSD LGPLv3 BSD / LGPLv3 [1] Licence publique Zope
Système de création de modèles HTML natif Oui Oui Oui Oui Oui
ORM natif / gestion des données Oui Oui Oui Oui Oui
Bibliothèque d'extensions Oui Oui Oui Oui Oui
Validation du formulaire Oui Oui Oui Oui Oui [2]
Protection contre la falsification des demandes intersites Oui Oui Oui Oui Oui
Gestion des utilisateurs / accès basé sur les rôles Oui Oui Oui Oui Oui
Prise en charge de Python 3 Oui Oui Non Oui Non
Migrations de schéma pour les modèles de données Oui Oui Oui Oui Non
Mise en cache des réponses Non Oui Oui Oui Oui
Aide à l'internationalisation Oui Oui Oui Oui Oui
Prise en charge des WebSockets natifs Non N ° 3] Oui Non Non
Environnement de développement interactif Oui Non Oui Non Oui

Django a des valeurs par défaut saines et sûres qui aident à protéger votre application Web contre les attaques. Lorsque vous placez une variable dans un modèle de page, comme une chaîne avec HTML ou JavaScript, le contenu n'est pas rendu littéralement à moins que vous ne désigniez explicitement l'instance de la variable comme sûre. Cela en soi réduit de nombreux problèmes courants de script intersite. Si vous souhaitez effectuer une validation de formulaire, vous pouvez tout utiliser, de la simple protection CSRF aux mécanismes complets de validation champ par champ qui renvoient des commentaires d'erreur détaillés.

Un ensemble de fonctionnalités aussi riche et large que celui de Django ne serait pas très utile sans une documentation robuste pour l'accompagner. Le site de documentation de Django explore tous les aspects du framework sous plusieurs angles. Travailler avec Python 3 ou d'autres versions du langage, assurer la sécurité, implémenter des composants d'application Web courants (comme des sessions ou la pagination), générer des plans de site, tout cela est couvert. Les API de chaque couche de l'application (modèle, vue et modèle) sont également décrites en détail.

Une grande puissance, cependant, s'accompagne d'une grande complexité. Les applications Django ont la réputation d'être extrêmement lourdes, avec de nombreuses pièces mobiles. Même une simple application Django avec seulement quelques routes nécessite une bonne quantité de configuration pour fonctionner. Si votre travail consiste à ne rien faire de plus que de configurer quelques points de terminaison REST simples, Django est presque certainement exagéré.

Django a aussi ses bizarreries. Par exemple, les modèles de page ne peuvent pas utiliser de callables. Exemple: vous pouvez passer en {{user.name}}tant que composant dans un modèle, mais pas {{user.get_name()}}. C'est l'une des façons dont Django garantit que les modèles ne font pas de mauvaises choses par inadvertance, mais ces contraintes peuvent être discordantes si vous n'y êtes pas préparé. Bien qu'il existe des solutions de contournement, elles ont tendance à nuire aux performances.

Le noyau de Django est synchrone. Cependant, une façon d'ajouter un comportement asynchrone consiste à utiliser le projet Django Channels. Ce projet, un add-on officiel de Django, ajoute la gestion asynchrone des connexions et des sockets à Django, tout en préservant les idiomes de programmation de Django.

Web2py

Dans le monde Ruby, Ruby on Rails est le framework web de facto. Massimo Di Pierro, professeur d'informatique à l'Université DePaul, s'est inspiré de Rails pour créer un framework Web en Python qui était tout aussi facile à configurer et à utiliser. Le résultat est Web2py.

La plus grande attraction de Web2py est son environnement de développement intégré. Lorsque vous configurez une instance de Web2py, vous disposez d'une interface Web, essentiellement un éditeur d'application Python en ligne, dans laquelle vous pouvez configurer les composants de l'application. Cela signifie généralement créer des modèles, des vues et des contrôleurs, chacun étant décrit via des modules Python ou des modèles HTML. Quelques exemples d'applications sont livrés avec Web2py prêts à l'emploi. Vous pouvez les démonter pour voir comment ils fonctionnent ou les utiliser comme modèles de démarrage pour créer vos propres applications.

Les développeurs déploient généralement Web2py en téléchargeant simplement son code source et en l'utilisant. Mais pour les utilisateurs moins techniques sous Windows ou MacOS, les créateurs de Web2py proposent des versions qui sont essentiellement des serveurs autonomes. Téléchargez, décompressez et exécutez l'une de ces versions, et vous aurez un serveur Web local avec une copie préconfigurée de Web2py intégrée. C'est un bon moyen de vous aider à créer une application Web2py, qui peut ensuite être déployée ailleurs au besoin.

L'interface Web de Web2py a été construite avec Bootstrap 2.16.1, donc c'est facile pour les yeux et facile à naviguer. L'éditeur intégré au navigateur ne remplace pas un IDE complet, mais il est équipé d'aides utiles telles que la numérotation des lignes et la coloration syntaxique Python (y compris l'auto-indentation). Une interface Web rapide vers le shell Python est également incluse, afin que vous puissiez interagir avec Web2py à partir de la ligne de commande si nécessaire - une belle concession aux experts.

Le système d'abstraction de données utilisé dans Web2py fonctionne un peu différemment de l'ORM de Django et d'autres ORM inspirés par celui-ci (comme Peewee). Ces systèmes utilisent des classes Python pour définir des modèles, où dans Web2py vous utilisez des fonctions de constructeur comme define_tablepour instancier des modèles. La plupart de ces différences ne sont susceptibles de contrarier que les personnes qui ont déjà l'expérience de l'une et commencent à utiliser l'autre; ils sont à peu près tout aussi complexes pour les nouveaux arrivants. Vous n'aurez probablement aucun problème pour attacher Web2py à un fournisseur de données, car il communique avec presque toutes les principales bases de données existantes.

Une fonction vraiment utile liée à la base de données est la possibilité de générer un diagramme des modèles, pour mieux visualiser comment vos modèles sont liés les uns aux autres. Vous devrez cependant installer la bibliothèque pygraphviz pour activer cette fonctionnalité.

Web2py fournit de nombreux autres composants de qualité professionnelle: fonctions d'internationalisation, plusieurs méthodologies de mise en cache, contrôle d'accès et autorisation, et même des effets frontaux (par exemple, un sélecteur de date dans les formulaires) via la prise en charge intégrée de jQuery et AJAX. Des hooks pour middleware externe et interne sont également inclus, bien que vous ne soyez pas autorisé à utiliser un middleware pour remplacer les fonctions principales de Web2py.

Une limitation importante de Web2py est qu'il est compatible avec Python 2.x uniquement. D'une part, cela signifie que Web2py ne peut pas utiliser la syntaxe asynchrone de Python 3. Pour deux, si vous comptez sur des bibliothèques externes exclusives à Python 3, vous n'avez pas de chance. Cependant, des travaux sont en cours pour rendre Web2py Python 3 compatible, et il est presque terminé au moment de la rédaction de cet article.

Il n'est pas étonnant que la documentation de Web2py soit appelée «le livre». Tout d'abord, il couvre une quantité incroyable de matériel sur Web2py, Python et les environnements de déploiement utilisés pour les deux. Deuxièmement, il est écrit dans un style narratif très accessible. Troisièmement, il traite en profondeur des scénarios courants de création d'applications. Il y a un chapitre entier, par exemple, sur l'utilisation de jQuery (fourni avec Web2Py) pour créer des applications AJAX.

Weppy

Weppy se sent à mi-chemin entre la simplicité minimale de Flask et l'exhaustivité de Django. Alors que le développement d'une application Weppy a la simplicité de Flash, Weppy est livré avec de nombreuses fonctionnalités trouvées dans Django, comme les couches de données et l'authentification. Ainsi, Weppy est adapté aux applications allant d'extrêmement simples à modestement sophistiquées.

À première vue, le code Weppy ressemble beaucoup au code Flask ou Bottle. Peu d'instructions sont nécessaires pour mettre en place un site Web de base à itinéraire unique. Les itinéraires peuvent être décrits par des décorateurs de fonction (la manière la plus simple) ou par programme, et la syntaxe pour le faire est étroitement liée à Flask / Bottle. La création de modèles fonctionne à peu près de la même manière, à part des variations mineures de syntaxe.

Weppy contraste avec ces autres frameworks en incluant certaines fonctionnalités qu'ils incorporent uniquement sous forme de plug-ins ou de modules complémentaires. Par exemple, ni Flask ni Bottle ne disposent d'un ORM intégré ou d'un système de gestion de données. Weppy inclut un ORM, bien que basé sur le projet pyDAL plutôt que sur SQLAlchemy, bien plus populaire. Weppy prend même en charge les migrations de schémas, que Django prend en charge dans le cadre de son ORM (également, le système de migration de Django est beaucoup plus automatisé). Bien que Weppy ait un mécanisme d'extension, la liste des add-ons officiellement approuvés est minuscule, bien plus petite que le catalogue d'extensions pour Flask.

Des frameworks plus légers comme Weppy sont souvent utilisés pour créer des API RESTful, et Weppy est équipé de fonctions pratiques à cet effet. Placez un décorateur @service sur une route, et les données que vous renvoyez sont automatiquement formatées dans votre choix de JSON ou XML.

Weppy inclut d'autres fonctionnalités qui semblent plus conformes à un cadre plus large, mais elles sont implémentées sans volume. Exemples: mécanismes de validation des données, gestion des formulaires, mise en cache des réponses et validation des utilisateurs. Dans tous ces cas, Weppy adopte une approche «juste assez». Les fonctionnalités fournies ne sont pas aussi complètes que vous pourriez trouver dans un framework de taille Django, mais un développeur n'a pas besoin d'investir beaucoup de travail pour les rendre utiles, et elles peuvent toujours être étendues après coup.

Une autre fonctionnalité trouvée dans Weppy généralement associée à un cadre plus lourd est la prise en charge de l'internationalisation. Les chaînes des modèles peuvent être traduites en fonction des fichiers de paramètres régionaux fournis avec l'application, qui sont de simples dictionnaires Python. Le choix de la langue peut également être défini en analysant la requête du navigateur (c'est-à-dire l'en-tête HTTP Accept-Language) ou en liant une traduction à une route spécifique.

La documentation de Weppy a la même saveur que le framework lui-même. Il est propre, lisible et écrit pour être consommé par les humains. Outre l'exemple d'application habituel «hello world», il comprend un joli didacticiel pas à pas qui vous permet de créer un système de micro-blogging en tant que projet de démarrage.

Les plans à long terme pour Weppy incluent la prise en charge d'async et de sockets en tant qu'entités de bas niveau et de première classe. Les développeurs de Weppy prévoient d'introduire ces fonctionnalités dans la version 2.0, puis d'exiger Python 3.7 ou supérieur pour toutes les futures versions de Weppy.

fiche d'évaluation Capacité native (20%) Gestion (20%) Installation (20%) Documentation (20%) Sécurité (10%) Évolutivité (10%) Note globale (100%)
Bouteille 0.12 8 dix dix 8 sept sept 8,6
CherryPy 17.0.0 sept 9 9 9 8 8 8.4
CubicWeb 3.26.4 dix 8 sept dix 9 sept 8,6
Django 2.1 dix 8 8 dix dix dix 9.2
Falcon 1.4.1 sept dix 8 8 sept sept 8,0
Flacon 1.0.2 8 9 8 9 8 8 8.4
Pyramide 1.9.2 8 8 8 dix 9 sept 8.4
Tornade 4.3 8 9 9 8 8 sept 8.3
Web.py 0,39 8 8 dix 8 9 8 8,5
Web2py 2.16.1 dix 9 sept dix 9 8 8,9
Weppy 1.2.11 dix 8 9 9 dix 9 9.1
Wheezy.web 0.1.485 9 9 8 8 8 8 8.4
Zope2 2.13.24 dix 8 sept 9 9 9 8,6