Créer un serveur Web Python de base avec Flask

Créer un serveur Web Python de base avec Flask

Flask est un micro-framework basé sur Python pour créer des pages Web. Il peut être utilisé pour présenter des interfaces Web sur le Pi et est relativement facile à configurer. C’est utile pour créer des tableaux de bord et je l’ai découvert pour la première fois en cherchant une méthode pour créer mon panneau de contrôle de pataugeoire.

Ce tutoriel vous expliquera comment créer un site de base pour vous aider à démarrer. Une fois que vous avez un exemple qui fonctionne, la documentation officielle peut être utilisée pour passer à des sujets plus avancés.

J’utilise Python 3 dans ce tutoriel. Cela devrait fonctionner de la même manière avec Python 2 mais vous devrez remplacer toutes les références à « python3 » par « python ».

Créer une nouvelle carte SD

Pour éviter les conflits avec d’autres logiciels que vous avez peut-être installés, je vous recommande de commencer avec une nouvelle carte SD en y écrivant la dernière image Raspbian. J’utilise Etcher pour écrire des images Raspberry Pi et pour mes premières expériences avec Flask, j’ai utilisé l’image Jessie Lite du page de téléchargement officielle.

Activer SSH

Par défaut, SSH est désactivé. Si vous souhaitez configurer le Pi sur le réseau à partir d’un autre ordinateur, vous pouvez l’activer soit :

  • Création d’un fichier vierge nommé « ssh » dans la partition de démarrage (sous Windows, c’est la seule partition à laquelle vous pouvez accéder)
  • Utilisation de l’utilitaire raspi-config pour activer SSH avec un moniteur et un clavier connectés au Pi

Consultez le guide Activation de SSH sur le Pi pour plus d’informations.

Trouver l’adresse IP

Découvrez l’adresse IP de votre Pi. Si vous utilisez un moniteur et un clavier, vous pouvez exécuter :

ifconfig

Il sera très probablement de la forme 192.168.#.#. Lors de la rédaction de ce tutoriel, mon Pi utilisait 192.168.1.19.

Si vous vous connectez à distance via SSH, vous pouvez utiliser un scanner IP pour le trouver ou il sera répertorié quelque part dans les paramètres de votre routeur.

Mettre à jour et modifier le mot de passe

Lors de l’activation de SSH, je recommanderais fortement de changer le mot de passe par défaut de « Raspberry Pi » !

Utiliser :

passwd

Définissez le nouveau mot de passe, puis exécutez :

sudo raspi-config

Sélectionnez « Avancé » suivi de « Développer le système de fichiers ».

Pour vous assurer que nous installerons les derniers packages, exécutez les deux commandes suivantes :

sudo apt-get update
sudo apt-get -y upgrade

Ce processus peut prendre 5 à 10 minutes.

Installer le pépin

Avant de pouvoir installer Flask, nous devons installer pip, le gestionnaire de packages Python :

sudo apt-get -y install python3-pip

Installer le flacon

Il est maintenant temps d’installer Flask :

sudo pip3 install flask

J’ai reçu quelques erreurs dans la sortie, mais à la fin, il a signalé « Fiole installée avec succès ».

Créer une application Flask de test

Maintenant que Flask est installé, nous devons créer un petit site de test pour vérifier que tout fonctionne. Dans ce tutoriel, je suppose que le site de test s’appelle « testSite ». Vous pouvez utiliser le nom de votre choix, mais vous devrez échanger toutes les références à « testSite » avec votre nom. Créer un nouveau dossier :

cd ~
mkdir testSite

Accédez au nouveau dossier et utilisez la commande suivante pour créer un nouveau script Python :

cd testSite
sudo nano testSite.py

Collez ensuite le code suivant :

from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
 return "<html><body>
<h1>Test site running under Flask</h1>

</body></html>"

if __name__ == "__main__":
 app.run(host="0.0.0.0",debug=True)

Appuyez sur « CTRL-X », « Y » et « Entrée » pour enregistrer et revenir à l’invite de commande.

Ce script définit un site Web simple d’une page.

Tester le serveur Web Python

Vous pouvez maintenant exécuter le script en utilisant :

python3 testSite.py

Si vous visitez l’adresse IP de votre Pi dans un navigateur, le site de test devrait être visible :

Site de test du serveur Web Python Flask

Notez que Flask utilise le port 5000 par défaut et que vous devez remplacer 192.168.1.19 par l’adresse IP réelle de votre Pi.

Ajout de pages supplémentaires

Le script peut être modifié pour ajouter des « pages » supplémentaires. Jetez un œil à l’exemple ci-dessous :

from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
 return "<html><body>
<h1>Test site running under Flask</h1>

</body></html>"

@app.route("/hello")
def hello():
 return "<html><body>
<h1>This is the hello page</h1>

</body></html>"
 
if __name__ == "__main__":
 app.run(host="0.0.0.0",debug=True)

Il ajoute un « itinéraire » supplémentaire appelé « bonjour ». Cette page s’affichera lorsque vous visiterez le sous-répertoire hello :

Site d'essai de flacon

Encore plus d’itinéraires

Vous pouvez également extraire des informations de l’URL dans votre script pour créer des combinaisons de pages plus élaborées. Dans cet exemple, nous avons ajouté les routes /user/ et /post/.

from flask import Flask,render_template
app = Flask(__name__)

@app.route("/")
def index():
  data=['Index Page','My Header','red']
  return render_template('template1.html',data=data)

@app.route("/hello")
def hello():
  data=['Hello Page','My Header','orange']
  return render_template('template1.html',data=data)
 
@app.route('/user/&lt;username&gt;')
def show_user(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/&lt;int:post_id&gt;')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id
 
if __name__ == "__main__":
  app.run(host="0.0.0.0",debug=True)

Entrez :5000/user/john ou :5000/post/42 et une page s’affiche avec le nom ou l’ID de la publication dans le cadre du contenu.

Utiliser des pages de modèles

Plutôt que de définir votre page HTML dans le script, vous pouvez utiliser des fichiers modèles pour contenir la majeure partie du code HTML. Cela rend le script beaucoup plus facile à gérer lorsque vos pages sont un peu plus compliquées.

Flask recherche des modèles dans le répertoire « templates ». Créez un nouveau répertoire pour les modèles :

mkdir /home/pi/testSite/templates
cd /home/pi/testSite/templates
nano template1.html

Collez ensuite dans cet exemple de modèle :

<!DOCTYPE html>
<html>
<head>
<title>{{ data[0] }}</title>
<link rel="stylesheet" href="https://www.raspberryme.com/static/style.css" />
</head>
<body>
<h1>{{ data[1] }}</h1>
Favourite Colour : {{ data[2] }}
</body>
</html>

Le testSite.py peut alors être mis à jour avec :

nano testSite.py

et le contenu remplacé par :

from flask import Flask,render_template
app = Flask(__name__)

@app.route("/")
def index():
 data=['Index Page','My Header','red']
 return render_template('template1.html',data=data)

@app.route("/hello")
def hello():
 data=['Hello Page','My Header','orange']
 return render_template('template1.html',data=data)
 
if __name__ == "__main__":
 app.run(host="0.0.0.0",debug=True)

Lorsque les deux « routes » sont activées, le même modèle est utilisé mais les valeurs qui lui sont transmises sont différentes. Ainsi, le visiteur voit une page légèrement différente.

Vous pouvez améliorer les modèles avec HTML et CSS. L’avantage des modèles est qu’ils gardent le script Python principal concentré sur les fonctionnalités et laissent la mise en page et l’esthétique au fichier modèle.

Mode débogage

Dans les exemples, l’indicateur « debug » est défini sur True. Cela exécute Flask en mode débogage qui recharge automatiquement Flask lorsque vous mettez à jour le script. Il fournit également des messages d’erreur si la page ne se charge pas. Si vous exposez le site à Internet, l’indicateur de débogage doit être défini sur False.

Script à exécution automatique au démarrage

Si vous souhaitez que le script Python s’exécute automatiquement au démarrage du Pi, vous pouvez utiliser cette technique :

crontab -e

Si vous y êtes invité, sélectionnez un éditeur à utiliser. J’ai tendance à utiliser « nano ». Insérez la ligne suivante en bas du bloc de commentaires :

@reboot /usr/bin/python3 /home/pi/testSite/testSite.py &

Appuyez sur « CTRL-X », « Y » et « Entrée » pour enregistrer et revenir à l’invite de commande.

Lorsque vous redémarrez, cela exécutera « testSite.py ». Le « & » assure qu’il s’exécute en arrière-plan.

sudo raspi-config

Sélectionnez « Options de démarrage » et « Bureau/CLI ». Sélectionnez « Connexion automatique à la console ». Cela signifie que lorsque le Pi démarre, il se connecte automatiquement en tant qu’utilisateur Pi.

Redémarrez en utilisant :

sudo reboot

et vos pages Web devraient être disponibles à l’adresse IP du Pi sur votre réseau.

Télécharger des scripts

Les exemples de scripts et de modèles de ce didacticiel sont disponibles dans mon référentiel BitBucket. Ils peuvent être téléchargés en utilisant ces liens : testSite1.py testSite2.py testSite3.py testSite4.py modèle1.py

Vous pouvez télécharger directement sur votre Pi en utilisant :

wget <url>

est l’une des URL de script ci-dessus. N’oubliez pas de télécharger les fichiers dans le bon répertoire. Les modèles doivent aller dans le répertoire « modèles ».

Documentation officielle et autres ressources

Il y a beaucoup plus d’informations sur la page de documentation officielle de Flask.

Cela vaut également la peine de jeter un coup d’œil à la Fondation Raspberry Pi – Construire un serveur Web Python avec Flask Didacticiel.