Serveur de fichiers
En utilisant les routes dynamiques, il est possible de créer un serveur de fichier en quelques lignes.
Bottle dispose d’une fonction static_file qui permet de renvoyer la réponse
correspondant à un fichier donné.
Cette fonction prend au moins 2 arguments obligatoires :
filename: un nom de fichier ou un chemin vers un fichierroot: un paramètre root qui indique à partir de quel répertoire de la machine on va chercher le fichier ci-dessus
Références :
- https://bottlepy.org/docs/dev/tutorial.html#serving-assets
- https://bottlepy.org/docs/dev/api.html#bottle.static_file
Ajouter une route pour les fichiers statiques
Il faut d'abord créer le répertoire de base pour les fichiers.
Traditionnellement, il s'appelle static ou assets ou public mais on peut
l'appeler comme on veut. Nous allons l'appeler static, dans le répertoire
serveur, et nous allons y ajouter un sous-répertoire images pour y placer
des images.
mkdir -p static/images
Si vous êtes en manque d'inspiration, vous pouvez télécharger quelques Tux (il
y en a 946) à partir de l'adresse suivante :
https://solidev.net/tux/tux1.png et les
placer dans le répertoire static/images.
cd static/images
wget https://solidev.net/tux/tux1.png
wget https://solidev.net/tux/tux2.png
wget https://solidev.net/tux/tux3.png
wget https://solidev.net/tux/tux4.png
Ce répertoire static doit être précisé dans le paramètre root de la fonction
static_files. On peut le définir de plusieurs manières :
- "en dur" :
root=/home/user/serveur/staticmais ce n'est pas "portable". - "en relatif" :
root=./staticmais ce n'est pas "portable" non plus, le chemin relatif est pris à partir du répertoire courant d'exécution du script, qui peut être différent selon l'endroit où on lance le script. - "calculé" :
root=join(dirname(__file__), "static")qui permet de calculer le chemin à partir du répertoire du script en cours d'exécution. C'est la méthode la plus portable (il faut au préalable importerjoinetdirnamedeos.path).
from os.path import join, dirname
from bottle import static_file #...
# ...
@route('/static/<filename:path>')
def server_static(filename):
return static_file(filename, root=join(dirname(__file__), "static"))
En pratique
Ajouter la route static
Rajouter la route /static/<filename:path> dans le fichier main.py pour
servir les fichiers statiques.
Correction
from bottle import route, run, template, static_file
from os.path import dirname, join
# ...
# Fichiers statiques
@route('/static/<filename:path>')
def server_static(filename):
return static_file(filename, root=join(dirname(__file__), "static"))
Afficher une image dans la page d'accueil
Dans le template de la page d'accueil, rajouter l'affichage d'une image provenant de notre serveur de fichier statique au dessus du message d'accueil.
Correction
<body>
<h1>Page d'accueil</h1>
<img class="home-img" src="/static/images/tux1.png" alt="Tux" width="200">
<p>Bienvenue sur notre site !</p>
<p><a href="/hello/Bob">Dire bonjour à Bob</a></p>
</body>
Créer un fichier CSS et l'utiliser
Créer un fichier style.css et y déplacer les styles définis dans les
templates, et lier ce fichier CSS dans le template de la page d'accueil avec
<link rel="stylesheet" href="/static/style.css">.
Correction
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Page d'accueil</title>
<link rel="stylesheet" href="/static/style.css">
</head>
body {
background-color: #f0f0f0;
color: #333;
font-family: Arial, sans-serif;
}
h1 {
color: #007BFF;
}
.home-img {
display: block;
margin: 0 auto;
border: 2px solid #007BFF;
border-radius: 10px;
padding: 5px;
}