.. _l-siteflask: Site Web, exemple avec Flask ============================ En entreprise, on a parfois besoin d'exposer de partager des données d'une machine à une autre, d'exécution des scripts sur une machine distante sans avoir à installer le langage Python. Dans le cas, le module :epkg:`Flask` permet de créer facilement un site web. .. contents:: :local: Tutoriel -------- C'est un notebook qui fait partie de l'ensemble :ref:`Python pour un économiste `. Outils pour tester un site -------------------------- * :ref:`f-simpleflasksite` * :ref:`f-flaskhelper` .. _l-flask-unittest: Unit Test --------- Cet exemple contient une fonction ``shutdown`` qui permet de dire au serveur de s'interrompre si jamais un lui demande un certain url. Dans ce cas, on peut écrire un test unitaire qui : * démarrer le serveur depuis un thread * essaye différents urls et vérifie le résultat Cela donne :: import sys, os, unittest, requests from pyquickhelper.loghelper import fLOG, get_url_content from ensae_teaching_cs.td_1a.simple_flask_site import app from ensae_teaching_cs.td_1a.flask_helper import FlaskInThread class TestSimpleFlask(unittest.TestCase): def test_flask(self) : fLOG (__file__, self._testMethodName, OutputPrint= __name__ == "__main__") th = FlaskInThread(app, host="localhost", port=8025) th.start() site = "http://localhost:8025/" # main page c = get_url_content(site) self.assertIn("Simple Flask Site", c) # exception c = get_url_content(site + "help/exception") self.assertIn("STACK:", c) # help for c = get_url_content(site + "help/ask/for/help") self.assertIn("help for command: ask/for/help", c) # shutdown c = requests.post(site + "shutdown/") self.assertIn("Server shutting down...", c.text) La fonction `get_url_content `_ récupère le contenu d'une page HTML. Pour faire bien, elle devrait prendre un compte un timeout. L'autre astuce consiste à attraper les exceptions dans le serveur puis à retourner la pile des exceptions afin que le programmeur débugge facilement le code du serveur. Dans le cas contraire, il faut ajouter des lignes logs dans le serveur pour savoir ce qu'il fait. C'est de toutes façons une bonne habitude à prendre. A noter : le module :epkg:`requests` simplifie beaucoup de choses dès qu'on commence à se pencher sur des problèmes d'authentification. Autres alternatives ------------------- Le module :epkg:`Flask` Pour des sites plus conséquents, la référence est `django `_. `autobahn/python `_ permet d'écrire simplement des sites qu'on programme par événements. Cela permet de ne pas laisser le serveur bloqué pendant qu'il effectue un traitement. Enfin, `brython `_ permet de remplacer le `javascript `_ par *python*. Plus simple à coder lorsqu'on ne connaît pas `javascript `_ mais cela revient à se priver de tout un tas d'outils écrit dans ce langage : `jquery `_, `angularJS `_, `node.js `_, `deno `_, `meteor `_ ... Une dizaine de modules Python permettant de créer un site web sont comparées par `Python's Web Framework Benchmarks `_. `django `_ est le choix le plus connu pour un site web professionnel écrit en Python. `Flask `_ est la référence pour un site minimaliste ou `micro-frameworks `_ mais il ne gère pas très bien la désynchronisation et une seule requête peut être géré en même temps. Le projet `falcon `_ est plus rapide ou encore `tornado `_. * `Django vs Flask vs Pyramid: Choosing a Python Web Framework `_ * `What are the best Python microframeworks? `_ * `13 Best Python Framework For Python Geeks `_