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

Quelle version ?

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=True permet de relancer le serveur automatiquement à chaque modification du code.
  • Le paramètre debug=True permet 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

Premiere requete


Programme

  • NSI 1ère : intéraction client/serveur, requêtes HTTP, réponses du serveur