|
@@ -1,20 +1,26 @@
|
|
|
-Title: A l'assaut de Falcon
|
|
|
|
|
-Category: Le développement web pour les nuls
|
|
|
|
|
-Tags: développement, Falcon, Python, web
|
|
|
|
|
-Date: 2018-07-09
|
|
|
|
|
|
|
+Title: Cure de minceur avec Falcon
|
|
|
|
|
+Category: Je tisse ma toile
|
|
|
|
|
+Tags: développement, Falcon, Python, web, un peu compliqué quand même
|
|
|
|
|
+Date: 2018-08-06
|
|
|
Summary: Premier contact avec le framework backend Falcon
|
|
Summary: Premier contact avec le framework backend Falcon
|
|
|
Image: /images/falcon_logo.svg
|
|
Image: /images/falcon_logo.svg
|
|
|
Lang: fr
|
|
Lang: fr
|
|
|
-Status: draft
|
|
|
|
|
|
|
+Status: published
|
|
|
|
|
|
|
|
___
|
|
___
|
|
|
|
|
|
|
|
![Falcon logo][falcon-logo]
|
|
![Falcon logo][falcon-logo]
|
|
|
|
|
|
|
|
-Après quelque temps à travailler sur un projet web perso assez complet, me
|
|
|
|
|
-voilà dans une énième phase de remise à plat de l'architecture du tout, qui me
|
|
|
|
|
-donne envie de passer du plus connu des frameworks web Python (Django) à un
|
|
|
|
|
-petit framework du nom de [Falcon][falcon].
|
|
|
|
|
|
|
+_Comme l'indique un de ses tags, et contrairement à ceux écrits jusqu'à maintenant,
|
|
|
|
|
+cet article est technique et pas du tout destiné à faire de la "vulgarisation",
|
|
|
|
|
+et ce sera certainement le cas de la plupart des prochains articles !_
|
|
|
|
|
+
|
|
|
|
|
+Dans [une énième phase de remise à plat de l'architecture de mon projet][erasing-all],
|
|
|
|
|
+certains nouveaux choix techniques m'ont amené à remettre en question mon
|
|
|
|
|
+utilisation du plus connu des frameworks web Python ([Django][django]), et à
|
|
|
|
|
+basculer sur un framework des plus minimalistes (et pas forcément parmi les
|
|
|
|
|
+alternatives les plus connues, comme Flask ou Bottle),
|
|
|
|
|
+du petit nom de [Falcon][falcon].
|
|
|
|
|
|
|
|
Précisons d'emblée qu'il y a quelques mois, je ne connaissais RIEN au
|
|
Précisons d'emblée qu'il y a quelques mois, je ne connaissais RIEN au
|
|
|
développement web (même la différence entre frontend et backend était un
|
|
développement web (même la différence entre frontend et backend était un
|
|
@@ -28,7 +34,7 @@ et réflexions peut être utile.
|
|
|
|
|
|
|
|
Bref, trêve de blabla.
|
|
Bref, trêve de blabla.
|
|
|
|
|
|
|
|
-# Mon architecture
|
|
|
|
|
|
|
+## Mon architecture
|
|
|
|
|
|
|
|
Après avoir enfin découvert les joies d'un "vrai" framework frontend, je me dis
|
|
Après avoir enfin découvert les joies d'un "vrai" framework frontend, je me dis
|
|
|
qu'il pourrait être profitable désormais de sévèrement limiter le travail du
|
|
qu'il pourrait être profitable désormais de sévèrement limiter le travail du
|
|
@@ -51,9 +57,9 @@ on est seul maître à bord, et qu'il me paraît raisonnable de m'y attaquer
|
|
|
maintenant que j'ai l'impression d'enfin vaguement comprendre ce qui se passe
|
|
maintenant que j'ai l'impression d'enfin vaguement comprendre ce qui se passe
|
|
|
dans un serveur Web.
|
|
dans un serveur Web.
|
|
|
|
|
|
|
|
-# Installation
|
|
|
|
|
|
|
+## Installation
|
|
|
|
|
|
|
|
-## Procédure
|
|
|
|
|
|
|
+### Procédure
|
|
|
|
|
|
|
|
On commence par se créer un petit environnement virtuel :
|
|
On commence par se créer un petit environnement virtuel :
|
|
|
|
|
|
|
@@ -96,7 +102,7 @@ variables d'environnement et permet aussi d'activer le virtualenv par un simple
|
|
|
source .venv/bin/activate
|
|
source .venv/bin/activate
|
|
|
# Des variables comme DEBUG=1 viendront s'ajouter ici
|
|
# Des variables comme DEBUG=1 viendront s'ajouter ici
|
|
|
|
|
|
|
|
-## Vérification
|
|
|
|
|
|
|
+### Vérification
|
|
|
|
|
|
|
|
On peut déjà se rassurer avec les [exemples du site officiel][falcon-examples]
|
|
On peut déjà se rassurer avec les [exemples du site officiel][falcon-examples]
|
|
|
histoire de vérifier que tout marche bien.
|
|
histoire de vérifier que tout marche bien.
|
|
@@ -135,10 +141,10 @@ histoire de vérifier que tout marche bien.
|
|
|
|
|
|
|
|
Bon, ça semble aller ... Et maintenant ?
|
|
Bon, ça semble aller ... Et maintenant ?
|
|
|
|
|
|
|
|
-# Premiers pas
|
|
|
|
|
|
|
+## Premiers pas
|
|
|
|
|
|
|
|
Le site officiel propose un [petit tutorial][falcon-tutorial] qui m'a semblé
|
|
Le site officiel propose un [petit tutorial][falcon-tutorial] qui m'a semblé
|
|
|
-plutôt bien fichu.
|
|
|
|
|
|
|
+plutôt bien fichu, et que je recommande.
|
|
|
|
|
|
|
|
J'en retiens plusieurs points.
|
|
J'en retiens plusieurs points.
|
|
|
|
|
|
|
@@ -156,7 +162,7 @@ de commande et debugger le tout avec ses outils préférés :
|
|
|
[2018-07-08 11:29:38 +0200] [13219] [INFO] Booting worker with pid: 13219
|
|
[2018-07-08 11:29:38 +0200] [13219] [INFO] Booting worker with pid: 13219
|
|
|
|
|
|
|
|
Mais on peut du coup avoir un petit environnement de développement bien pratique
|
|
Mais on peut du coup avoir un petit environnement de développement bien pratique
|
|
|
-(ici avec Pycharm Community Edition) :
|
|
|
|
|
|
|
+(ici avec [Pycharm **Community Edition**][pycharm]) :
|
|
|
|
|
|
|
|
![Pycharm et Falcon][pycharm-falcon]
|
|
![Pycharm et Falcon][pycharm-falcon]
|
|
|
|
|
|
|
@@ -164,35 +170,45 @@ En dehors on est effectivement vraiment "à poil" ! Le moindre petit test unitai
|
|
|
sur une API qui renvoie un bête tableau en JSON nécessite de
|
|
sur une API qui renvoie un bête tableau en JSON nécessite de
|
|
|
sortir des lignes comme `result = json.loads(response.content.decode())`.
|
|
sortir des lignes comme `result = json.loads(response.content.decode())`.
|
|
|
|
|
|
|
|
-Côté serveur, quelques petits trucs sont proposés de base comme [le décodage du
|
|
|
|
|
-contenu envoyé par le client][falcon-media], mais seul le JSON est supporté de base ; pour
|
|
|
|
|
-d'autres types, il faudra aller décoder le stream binaire "à la main".
|
|
|
|
|
|
|
+Côté serveur, quelques petits trucs sont proposés de base comme
|
|
|
|
|
+[le décodage du contenu envoyé par le client][falcon-media], mais seul le JSON
|
|
|
|
|
+est supporté de base ; pour d'autres types, il faudra aller décoder le stream
|
|
|
|
|
+binaire "à la main".
|
|
|
|
|
|
|
|
**Le second**, c'est que dès le tutorial, ils mettent l'accent sur l'importance
|
|
**Le second**, c'est que dès le tutorial, ils mettent l'accent sur l'importance
|
|
|
des tests, et ça me plait bien !
|
|
des tests, et ça me plait bien !
|
|
|
|
|
|
|
|
**Le troisième**, c'est que tout paraît assez clair et cohérent, et qu'il n'y a
|
|
**Le troisième**, c'est que tout paraît assez clair et cohérent, et qu'il n'y a
|
|
|
-que peu de concepts à maîtriser : les requêtes, les réponses, le routage (rien
|
|
|
|
|
-de bien mystérieux pour un dev-web), les middlewares (classiques en backend).
|
|
|
|
|
-Le concept central est celui de "ressource" qui comme son nom l'indique représente
|
|
|
|
|
|
|
+que peu de concepts à maîtriser : les **_requêtes_**, les **_réponses_**,
|
|
|
|
|
+le **_routage_** (rien de bien mystérieux pour un dev-web), les **_middlewares_**
|
|
|
|
|
+(classiques en backend). Le concept central est celui de **_ressource_** qui
|
|
|
|
|
+comme son nom l'indique représente
|
|
|
l'objet qu'on souhaite récupérer, modifier ou créer (et il a le même sens que
|
|
l'objet qu'on souhaite récupérer, modifier ou créer (et il a le même sens que
|
|
|
-dans la terminologie RESTful), et auquel on associera directement une "route".
|
|
|
|
|
-S'ajoutent juste à tout cela les "hooks" qui à première vue seront utiles pour
|
|
|
|
|
|
|
+dans la terminologie RESTful), et auquel on associera directement une **_route_**.
|
|
|
|
|
+S'ajoutent juste à tout cela les **_hooks_** qui à première vue seront utiles pour
|
|
|
factoriser du code sur une ressource particulière ou certaines requêtes
|
|
factoriser du code sur une ressource particulière ou certaines requêtes
|
|
|
spécifiques.
|
|
spécifiques.
|
|
|
|
|
|
|
|
Accessoirement, presque tout fonctionne via le principe du duck-typing ; une
|
|
Accessoirement, presque tout fonctionne via le principe du duck-typing ; une
|
|
|
classe de middleware par exemple n'aura pas besoin de dériver d'un objet
|
|
classe de middleware par exemple n'aura pas besoin de dériver d'un objet
|
|
|
-particulier (à la Django, et avec [tout ce que ça implique][django-cbv]),
|
|
|
|
|
|
|
+particulier (à la Django, et avec [tout ce que ça implique][django-cbv] comme
|
|
|
|
|
+méthodes et classes à connaître plus ou moins par coeur),
|
|
|
mais simplement d'implémenter quelques méthodes particulières.
|
|
mais simplement d'implémenter quelques méthodes particulières.
|
|
|
|
|
|
|
|
**Le quatrième et dernier**, c'est qu'il y a du boulot pour la suite ! Il va
|
|
**Le quatrième et dernier**, c'est qu'il y a du boulot pour la suite ! Il va
|
|
|
-falloir faire connaissance avec toutes les librairies Python standard pour gérer
|
|
|
|
|
-tout ce qui était inclus de base dans Django ...
|
|
|
|
|
|
|
+falloir faire connaissance avec toutes les librairies Python classiques pour gérer
|
|
|
|
|
+tout ce qui était inclus de base dans Django ... Mais c'est tout l'avantage d'un
|
|
|
|
|
+framework aussi minimaliste, qui permet d'aller piocher dans l'écosystème Python
|
|
|
|
|
+des solutions généralement bien plus évoluées que celles proposées dans
|
|
|
|
|
+l'écosystème Django ... tout en étant facilement intégrables, contrairement aux
|
|
|
|
|
+autres petits frameworks qui proposent souvent dans leur écosystème des couches
|
|
|
|
|
+d'adaptation de ces libraries. Avec Falcon, on choisit ce qu'on veut et on
|
|
|
|
|
+l'intègre comme on veut !
|
|
|
|
|
|
|
|
D'autres articles à suivre, donc !
|
|
D'autres articles à suivre, donc !
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+[erasing-all]: {filename}/content/on-efface-tout.md
|
|
|
[falcon-logo]: {filename}/images/falcon_logo.svg
|
|
[falcon-logo]: {filename}/images/falcon_logo.svg
|
|
|
[falcon-install]: https://falcon.readthedocs.io/en/stable/user/install.html#install
|
|
[falcon-install]: https://falcon.readthedocs.io/en/stable/user/install.html#install
|
|
|
[httpie]: https://github.com/jkbr/httpie
|
|
[httpie]: https://github.com/jkbr/httpie
|
|
@@ -202,3 +218,7 @@ D'autres articles à suivre, donc !
|
|
|
[falcon-media]: https://falcon.readthedocs.io/en/stable/api/media.html#media
|
|
[falcon-media]: https://falcon.readthedocs.io/en/stable/api/media.html#media
|
|
|
[pycharm-falcon]: {filename}/images/pycharm-falcon.png
|
|
[pycharm-falcon]: {filename}/images/pycharm-falcon.png
|
|
|
[django-cbv]: https://ccbv.co.uk/
|
|
[django-cbv]: https://ccbv.co.uk/
|
|
|
|
|
+[django]: https://www.djangoproject.com/
|
|
|
|
|
+[pycharm]: https://www.jetbrains.com/pycharm/download/
|
|
|
|
|
+[flask]: http://flask.pocoo.org/
|
|
|
|
|
+[bottle]: https://bottlepy.org/docs/dev/
|