浏览代码

Write a beginner's article on Falcon

theenglishway (time) 7 年之前
父节点
当前提交
f89df01e44
共有 3 个文件被更改,包括 254 次插入0 次删除
  1. 50 0
      content/images/falcon_logo.svg
  2. 二进制
      content/images/pycharm-falcon.png
  3. 204 0
      content/posts/falcon-intro.md

+ 50 - 0
content/images/falcon_logo.svg

@@ -0,0 +1,50 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="376.000000pt" height="376.000000pt" viewBox="0 0 376.000000 376.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.15, written by Peter Selinger 2001-2017
+</metadata>
+<g transform="translate(0.000000,376.000000) scale(0.100000,-0.100000)"
+fill="#f0ad4e" stroke="none">
+<path d="M659 3513 c-232 -240 -349 -482 -349 -723 0 -55 4 -102 10 -105 6 -3
+10 -16 10 -28 0 -28 24 -97 56 -162 42 -87 103 -148 269 -268 130 -94 202
+-200 226 -334 l13 -72 36 15 c91 39 161 53 370 75 134 14 186 34 248 95 88 88
+46 145 -229 308 -296 176 -402 258 -517 401 -92 115 -139 210 -162 328 -22
+110 8 284 75 440 19 46 35 86 35 90 0 21 -33 -1 -91 -60z"/>
+<path d="M3325 3432 c-5 -4 -18 -24 -27 -44 -58 -124 -250 -241 -553 -335 -27
+-9 -75 -23 -105 -33 -30 -9 -89 -28 -130 -40 -509 -155 -598 -235 -780 -695
+-82 -206 -125 -275 -210 -331 -71 -48 -129 -64 -290 -84 -256 -31 -355 -61
+-435 -132 -49 -42 -65 -86 -65 -174 0 -40 -4 -75 -8 -78 -5 -3 -14 -30 -21
+-61 -10 -42 -10 -63 -1 -90 14 -41 53 -75 88 -75 25 0 26 7 7 52 -4 11 2 25
+19 43 22 22 33 25 101 25 78 0 104 8 141 42 21 19 22 19 50 -12 59 -65 213
+-157 405 -243 91 -41 148 -90 191 -166 29 -50 33 -64 33 -136 0 -117 -42 -197
+-124 -235 -14 -7 -34 -16 -43 -21 -10 -5 -47 -9 -83 -9 l-65 0 -21 -47 c-12
+-27 -27 -60 -35 -74 -11 -22 -11 -29 0 -45 13 -17 17 -15 65 34 50 51 81 66
+81 38 0 -8 -18 -28 -39 -45 -49 -39 -56 -67 -33 -133 19 -54 44 -70 50 -33 2
+11 17 33 33 49 16 15 29 34 29 41 0 7 7 18 15 25 22 18 31 -14 17 -64 -9 -34
+-8 -44 5 -58 10 -11 13 -26 9 -43 -4 -18 -2 -25 7 -25 14 0 47 31 47 44 0 4 9
+21 21 37 21 30 22 36 3 142 -3 20 -2 37 2 37 21 0 93 -46 97 -62 7 -26 37 -11
+37 19 0 38 -27 80 -60 95 -33 14 -39 36 -12 44 63 20 122 56 175 109 64 62 75
+75 116 135 57 83 110 120 171 120 84 0 348 -118 552 -247 95 -60 281 -190 312
+-218 6 -6 40 -31 76 -57 36 -25 98 -73 138 -107 40 -33 76 -61 80 -61 33 0 44
+86 15 112 -10 8 -45 30 -78 48 -73 41 -214 136 -275 187 -138 113 -314 334
+-431 541 -11 17 -28 48 -39 68 -84 147 -244 334 -287 334 -17 0 -17 1 10 130
+8 41 20 111 26 155 18 122 44 261 63 330 54 203 169 344 378 462 293 167 410
+270 494 437 45 89 54 111 81 211 14 51 31 175 24 175 -2 0 -8 -4 -14 -8z"/>
+<path d="M1595 1067 c-2 -7 -5 -32 -8 -58 -6 -70 -53 -163 -107 -213 -65 -61
+-105 -80 -139 -67 -14 5 -54 13 -88 16 -50 6 -68 3 -92 -11 -26 -15 -31 -25
+-31 -56 0 -44 -1 -43 36 -23 16 8 35 15 42 15 21 0 13 -20 -13 -32 -29 -13
+-37 -38 -39 -116 -1 -59 17 -82 33 -40 5 13 24 31 42 41 19 10 45 36 59 57 26
+44 40 51 40 21 0 -64 33 -67 61 -5 17 34 26 43 38 38 33 -14 72 -16 86 -4 14
+12 13 16 -6 36 -12 13 -21 25 -18 27 22 16 70 27 119 27 88 0 100 15 100 128
+0 115 -30 197 -79 218 -25 10 -33 11 -36 1z"/>
+<path d="M2400 852 c0 -5 37 -28 83 -51 221 -117 357 -244 408 -385 23 -61 24
+-83 4 -129 -25 -61 -29 -60 133 -55 146 5 232 21 232 44 0 11 -120 124 -164
+153 -12 8 -23 18 -26 21 -3 3 -23 19 -45 36 -22 16 -46 34 -52 39 -7 6 -23 18
+-35 27 -13 10 -41 32 -63 49 -22 17 -56 40 -75 50 -46 25 -74 43 -80 50 -7 8
+-145 83 -210 114 -30 14 -63 30 -72 35 -22 12 -38 13 -38 2z"/>
+</g>
+</svg>

二进制
content/images/pycharm-falcon.png


+ 204 - 0
content/posts/falcon-intro.md

@@ -0,0 +1,204 @@
+Title: A l'assaut de Falcon
+Category: Le développement web pour les nuls
+Tags: développement, Falcon, Python, web
+Date: 2018-07-09
+Summary: Premier contact avec le framework backend Falcon
+Image: /images/falcon_logo.svg
+Lang: fr
+Status: draft
+
+___
+
+![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].
+
+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
+mystère pour moi), et si partir sur Django m'a énormément aidé à démêler tout
+ça à mon rythme, il me semble maintenant un peu "overkill" pour accomplir les
+tâches que je souhaite désormais déléguer au backend.
+
+Je reviendrai peut être sur tout ça dans un prochain article, mais me voilà
+donc parti dans l'exploration d'un nouvel outil, et partager mes découvertes
+et réflexions peut être utile.
+
+Bref, trêve de blabla.
+
+# Mon architecture
+
+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
+backend, que je laissais absolument tout faire jusque là : authentification, gestion de
+sessions, rendu des pages, validation des données, gestion des formulaires,
+génération du site d'administration, gestion
+automatisée des migrations de la base de données, internationalisation,
+localisation, etc. (merci Django).
+
+Cette fois, je repars sur du très basique :
+
+* interaction avec la base de données
+* validation des données
+* présentation d'une jolie API RESTful
+* authentification
+
+La liste se complétera peut-être au fur et à mesure de mon avancement, mais du
+coup l'approche très minimaliste de Falcon me plaît bien, dans la mesure où
+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
+dans un serveur Web.
+
+# Installation
+
+## Procédure
+
+On commence par se créer un petit environnement virtuel :
+
+    :::sh
+    # theenglishway @ time in ~/Documents [9:05:01]
+    $ mkdir falcon
+
+    # theenglishway @ time in ~/Documents [9:06:30]
+    $ cd falcon
+
+    # theenglishway @ time in ~/Documents/falcon [9:06:31]
+    $ python3 -m venv ./.venv
+
+    # theenglishway @ time in ~/Documents/falcon [9:06:47]
+    $ source .venv/bin/activate
+
+Puis on peut suivre gentiment les
+[instructions d'installation de la page officielle][falcon-install] et
+ajouter aussi l'excellent utilitaire [HTTPie][httpie] qui est recommandé par les
+développeurs de Falcon (et sera bien pratique pour communiquer avec l'API).
+
+    :::sh
+    (.venv)
+    # theenglishway @ time in ~/Documents/falcon [9:22:10]
+    $ pip install falcon gunicorn httpie
+
+C'est aussi le bon moment pour créer un fichier requirements.txt
+
+    :::sh
+    (.venv)
+    # theenglishway @ time in ~/Documents/falcon [9:22:10]
+    $ pip freeze > ./requirements.txt
+
+... et pour créer son repo git, le .gitignore qui va bien, etc. Personnellement
+j'aime bien avoir un fichier non versionné `.envsetup` qui contient les
+variables d'environnement et permet aussi d'activer le virtualenv par un simple
+`source .envsetup`.
+
+    :::sh
+    source .venv/bin/activate
+    # Des variables comme DEBUG=1 viendront s'ajouter ici
+
+## Vérification
+
+On peut déjà se rassurer avec les [exemples du site officiel][falcon-examples]
+histoire de vérifier que tout marche bien.
+
+    :::sh
+    (.venv)
+    # theenglishway @ time in ~/Documents/falcon on git:master x [9:58:33]
+    $ http :8000/things
+    HTTP/1.1 200 OK
+    Connection: close
+    Date: Sun, 08 Jul 2018 07:58:47 GMT
+    Server: gunicorn/19.9.0
+    content-length: 100
+    content-type: application/json; charset=UTF-8
+
+    Two things awe me most, the starry sky above me and the moral law within me.
+
+        ~ Immanuel Kant
+
+    (.venv)
+    # theenglishway @ time in ~/Documents/falcon on git:master x [10:03:16]
+    $ http localhost:8000/1/things authorization:custom-token
+    HTTP/1.0 200 OK
+    Date: Sun, 08 Jul 2018 08:03:40 GMT
+    Server: WSGIServer/0.2 CPython/3.5.3
+    content-length: 66
+    content-type: application/json; charset=UTF-8
+    powered-by: Falcon
+
+    [
+        {
+            "color": "green",
+            "id": "fc9aee6e-5f2c-46e7-bb5e-1535475f2220"
+        }
+    ]
+
+Bon, ça semble aller ... Et maintenant ?
+
+# Premiers pas
+
+Le site officiel propose un [petit tutorial][falcon-tutorial] qui m'a semblé
+plutôt bien fichu.
+
+J'en retiens plusieurs points.
+
+**Le premier**, c'est que c'est vraiment du baremetal ! Pas besoin d'invoquer
+toute la machinerie cachée d'un Django, on peut lancer l'application en ligne
+de commande et debugger le tout avec ses outils préférés :
+
+    :::sh
+    (.venv)
+    # theenglishway @ time in ~/Documents/falcon on git:master x [10:19:12] C:1
+    $ gunicorn --reload myapp/app.py
+    [2018-07-08 11:29:38 +0200] [13216] [INFO] Starting gunicorn 19.9.0
+    [2018-07-08 11:29:38 +0200] [13216] [INFO] Listening at: http://127.0.0.1:8000 (13216)
+    [2018-07-08 11:29:38 +0200] [13216] [INFO] Using worker: sync
+    [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
+(ici avec Pycharm Community Edition) :
+
+![Pycharm et Falcon][pycharm-falcon]
+
+En dehors on est effectivement vraiment "à poil" ! Le moindre petit test unitaire
+sur une API qui renvoie un bête tableau en JSON nécessite de
+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".
+
+**Le second**, c'est que dès le tutorial, ils mettent l'accent sur l'importance
+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
+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
+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
+spécifiques.
+
+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
+particulier (à la Django, et avec [tout ce que ça implique][django-cbv]),
+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
+falloir faire connaissance avec toutes les librairies Python standard pour gérer
+tout ce qui était inclus de base dans Django ...
+
+D'autres articles à suivre, donc !
+
+
+[falcon-logo]: {filename}/images/falcon_logo.svg
+[falcon-install]: https://falcon.readthedocs.io/en/stable/user/install.html#install
+[httpie]: https://github.com/jkbr/httpie
+[falcon-examples]: https://falcon.readthedocs.io/en/stable/user/quickstart.html
+[falcon-tutorial]: https://falcon.readthedocs.io/en/stable/user/tutorial.html
+[falcon]: https://falconframework.org/
+[falcon-media]: https://falcon.readthedocs.io/en/stable/api/media.html#media
+[pycharm-falcon]: {filename}/images/pycharm-falcon.png
+[django-cbv]: https://ccbv.co.uk/