Serveur
Le micro-framework bottle tient en un fichier unique, il est donc possible de
l'utiliser sans pip ou autre gestionnaire de paquets. Il suffit de télécharger
le fichier bottle.py dans le répertoire de votre projet et de l'importer dans
votre code python. Cependant, il est recommandé d'utiliser un gestionnaire de
paquets pour pouvoir ensuite ajouter proprement d'autres dépendances.
Installation de bottle
La page d'accueil de bottle
(https://bottlepy.org/docs/dev/) donne les
liens pour télécharger le fichier bottle.py :
https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py
Sinon, avec uv, dans le répertoire du projet :
uv add https://github.com/bottlepy/bottle.git
Bottle a pas mal d'années d'existence, et est d'une grande stabilité.
La version stable actuelle est la 0.13.3, mais elle comporte quelques soucis
liés à l'encodage des caractères. La version de développement est donc
conseillée, ou d'ici peu, la version 0.14 (ou 1.0.0)
Nous allons ensuite suivre plus ou moins le tutoriel de bottle : https://bottlepy.org/docs/dev/tutorial.html#hello-world
Premier serveur "hello world"
Dans le fichier main.py, copier le code suivant
(code) :
from bottle import route, run
@route('/hello')
def hello():
return "Hello World!"
if __name__ == '__main__':
run(host='localhost', port=38083, debug=True, reloader=True)
Le programme ci-dessus ne comporte que 6 lignes de code, et c'est pourtant déjà un serveur web !!!
Lancer le serveur
python3 main.py
# ou bien uv run main.py
# ou bien bouton "play" de l'IDE
Le site est alors disponible à l'adresse suivante : http://localhost:38083/hello, ou sur https://xxxxx-app.formation.devel.space/hello si vous utilisez l'IDE en ligne de la formation.
- Le paramètre
reloader=Truepermet de relancer le serveur automatiquement à chaque modification du code. - Le paramètre
debug=Truepermet d'afficher les erreurs dans le navigateur.
Pour comprendre un peu mieux ce petit programme, il faut bien se rappeler les points suivants, vus précédemment :
- la communication entre un client et un serveur se fait en TCP/IP (transport)
- le client envoie une requète au serveur (une machine identifiée par son adresse IP ou son nom de domaine), sur un port donné; dans notre cas, la requète est une requète utilisant le protocole HTTP
- le serveur écoute le port sur l’IP, et répond à la requète.
Ici, le port d’écoute est 38083, l’IP est l’ip locale (localhost =
127.0.0.1, qui ne sort pas de la machine), et le serveur est configuré pour
renvoyer le message “Hello World!” à une requète spécifique.
Il n'y a pas un poil de HTML dans la réponse, mais c'est une réponse tout à fait valide.
Tester le serveur
Lors du lancement du serveur, vous devriez voir un message du type :
Bottle v0.13.3 server starting up (using WSGIRefServer())...
Listening on http://localhost:38083/
Hit Ctrl-C to quit.
...
Traduction : je suis un serveur utilisant Bottle v0.13.3, j’écoute sur localhost, sur le port 38083 (notation IP:PORT); pour terminer mon exécution, appuyez sur Ctrl-C.
Prenez un navigateur, et tapez l’adresse de votre serveur dans la barre d’adresse (pas dans google ni dans le champ de recherche !!)... votre navigateur doit afficher le message "Hello World", et votre programme, dans son terminal, a lui affiché une ou plusieurs lignes du type
127.0.0.1 - - [17/Apr/2025 12:32:00] "GET /hello HTTP/1.1" 200 12
127.0.0.1 - - [17/Apr/2025 12:32:00] "GET /favicon.ico HTTP/1.1" 404 766
qui sont affichées grâce au paramètre de debug, et qui précisent :
- l’adresse IP du client : ici 127.0.0.1
- la page qui fait référence à la page actuelle (lorsqu’on suit un lien sur un site, ce qui n’est pas le cas ici, le champ est donc vide : c’est l’espace entre les - -)
- la date et l’heure de la requète
- la requète HTTP
- le code de réponse
- le nombre d’octets de la réponse
Ici, la méthode de la requète est GET, le client demande l’URL /hello en
utilisant le protocole HTTP/1.1. Il y a aussi des en-têtes (non affichés ici),
au minimum un en-tête “Host:” indiquant quel est la partie “hôte” de la demande
( http://host/url ).
Le serveur renvoie une réponse comprenant entre autres un code-réponse : ici 200 indique un succès, et 404 indique “page non trouvée” (le navigateur demande automatiquement la favicon, l’icône pour les favoris, que notre serveur n’est pas programmé pour envoyer : aucune route ne lui correspond).
Pour mieux saisir cet échange, nous pouvons l’espionner un peu plus : dans votre navigateur, ouvrez les outils de développement, activez l’onglet réseau, et rechargez votre page http://localhost:38083/hello ou https://xxxx-app.formation.devel.space/hello ... Vous voyez apparaître une ligne, indiquant qu’une requète a été faite. En développant cette ligne, vous avez toutes les informations sur la requète et la réponse, formatté sympathiquement, qui ressemblent à celles vues précédemment
