{"id":405,"date":"2026-05-22T16:00:35","date_gmt":"2026-05-22T14:00:35","guid":{"rendered":"https:\/\/eryann.fr\/?p=405"},"modified":"2026-05-22T16:00:38","modified_gmt":"2026-05-22T14:00:38","slug":"fiche-api-avec-flask","status":"publish","type":"post","link":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/","title":{"rendered":"Fiche API avec flask"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans un BTS CIEL ou SIO, tu vas tr\u00e8s souvent d\u00e9velopper ou interfacer des services web. Aujourd\u2019hui, presque toutes les applications communiquent gr\u00e2ce \u00e0 des API REST. Un serveur web, une application mobile, un outil de supervision ou un portail m\u00e9tier utilisent g\u00e9n\u00e9ralement des \u00e9changes HTTP au format JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flask permet de cr\u00e9er rapidement une API en Python avec une structure simple et p\u00e9dagogique. Tu peux ainsi comprendre facilement le fonctionnement des routes HTTP, des r\u00e9ponses JSON, des m\u00e9thodes GET\/POST et des codes de retour.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans cette fiche, tu vas apprendre \u00e0 :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>installer Flask ;<\/li>\n\n\n\n<li>cr\u00e9er une API REST simple ;<\/li>\n\n\n\n<li>manipuler les m\u00e9thodes HTTP ;<\/li>\n\n\n\n<li>recevoir et retourner du JSON ;<\/li>\n\n\n\n<li>s\u00e9curiser ton API ;<\/li>\n\n\n\n<li>superviser les logs ;<\/li>\n\n\n\n<li>ouvrir correctement les ports avec UFW ;<\/li>\n\n\n\n<li>tester l\u2019API avec <code>curl<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cette fiche utilise principalement Debian et Ubuntu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Sommaire<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Introduction<\/li>\n\n\n\n<li>Sommaire<\/li>\n\n\n\n<li>Comprendre le fonctionnement d\u2019une API Flask<\/li>\n\n\n\n<li>Installer Flask sur Debian et Ubuntu<\/li>\n\n\n\n<li>Arborescence recommand\u00e9e du projet<\/li>\n\n\n\n<li>Synth\u00e8se Markdown pour ta fiche bristol<\/li>\n\n\n\n<li>Fichiers importants<\/li>\n\n\n\n<li>Configuration compl\u00e8te d\u2019une API Flask<\/li>\n\n\n\n<li>Comprendre le code Flask en d\u00e9tail<\/li>\n\n\n\n<li>Tester l\u2019API<\/li>\n\n\n\n<li>G\u00e9rer les m\u00e9thodes HTTP<\/li>\n\n\n\n<li>Utiliser des param\u00e8tres et du JSON<\/li>\n\n\n\n<li>S\u00e9curiser une API Flask<\/li>\n\n\n\n<li>Configurer le pare-feu UFW<\/li>\n\n\n\n<li>Superviser et analyser les logs<\/li>\n\n\n\n<li>Commandes utiles et d\u00e9pannage<\/li>\n\n\n\n<li>Cas concrets d\u2019utilisation<\/li>\n\n\n\n<li>Erreurs fr\u00e9quentes<\/li>\n\n\n\n<li>Bonnes pratiques<\/li>\n\n\n\n<li>Pour aller plus loin<\/li>\n\n\n\n<li>Liens utiles et documentation officielle<\/li>\n\n\n\n<li>Propositions de TP<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">3. Comprendre le fonctionnement d\u2019une API Flask<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une API REST fonctionne gr\u00e2ce au protocole HTTP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le client envoie une requ\u00eate :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GET \u2192 lire des donn\u00e9es ;<\/li>\n\n\n\n<li>POST \u2192 ajouter des donn\u00e9es ;<\/li>\n\n\n\n<li>PUT \u2192 modifier ;<\/li>\n\n\n\n<li>DELETE \u2192 supprimer.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Le serveur Flask r\u00e9pond g\u00e9n\u00e9ralement au format JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Client :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/api\/status HTTP\/1.1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9ponse :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{<br>    \"status\": \"ok\"<br>}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flask agit comme un micro-framework web Python. Il fournit :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>un serveur HTTP ;<\/li>\n\n\n\n<li>un syst\u00e8me de routes ;<\/li>\n\n\n\n<li>la gestion des requ\u00eates ;<\/li>\n\n\n\n<li>la gestion des r\u00e9ponses JSON.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4. Installer Flask sur Debian et Ubuntu<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Mettre le syst\u00e8me \u00e0 jour<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update &amp;&amp; sudo apt upgrade -y<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>apt update<\/code> met \u00e0 jour la liste des paquets.<\/li>\n\n\n\n<li><code>apt upgrade<\/code> installe les nouvelles versions.<\/li>\n\n\n\n<li><code>-y<\/code> valide automatiquement les confirmations.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 Installer Python et venv<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install python3 python3-pip python3-venv -y<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Paquets install\u00e9s :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>python3<\/code> : interpr\u00e9teur Python ;<\/li>\n\n\n\n<li><code>python3-pip<\/code> : gestionnaire de paquets Python ;<\/li>\n\n\n\n<li><code>python3-venv<\/code> : environnement virtuel Python.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.3 Cr\u00e9er le projet<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/projets\/flask-api<br>cd ~\/projets\/flask-api<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>mkdir -p<\/code> cr\u00e9e les dossiers n\u00e9cessaires.<\/li>\n\n\n\n<li><code>cd<\/code> permet d\u2019entrer dans le r\u00e9pertoire.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.4 Cr\u00e9er un environnement virtuel<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 -m venv venv<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette commande cr\u00e9e un environnement Python isol\u00e9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.5 Activer l\u2019environnement virtuel<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>source venv\/bin\/activate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le shell utilise maintenant les paquets Python du projet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.6 Installer Flask<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install flask<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tu peux \u00e9galement installer Werkzeug et Gunicorn :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install gunicorn<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>gunicorn<\/code> sert \u00e0 ex\u00e9cuter Flask en production.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5. Arborescence recommand\u00e9e du projet<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>flask-api\/<br>\u251c\u2500\u2500 app.py<br>\u251c\u2500\u2500 requirements.txt<br>\u251c\u2500\u2500 venv\/<br>\u251c\u2500\u2500 logs\/<br>\u2502   \u2514\u2500\u2500 api.log<br>\u251c\u2500\u2500 static\/<br>\u2514\u2500\u2500 templates\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Explications :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>app.py<\/code> : application principale ;<\/li>\n\n\n\n<li><code>requirements.txt<\/code> : d\u00e9pendances Python ;<\/li>\n\n\n\n<li><code>logs\/<\/code> : journaux applicatifs ;<\/li>\n\n\n\n<li><code>static\/<\/code> : fichiers statiques ;<\/li>\n\n\n\n<li><code>templates\/<\/code> : templates HTML si besoin.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">6. Synth\u00e8se Markdown pour ta fiche bristol<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># API Flask<br><br>## Installation<br>sudo apt install python3 python3-pip python3-venv -y<br><br>python3 -m venv venv<br>source venv\/bin\/activate<br><br>pip install flask gunicorn<br><br>## Lancer l'API<br>python3 app.py<br><br>## Route GET<br>@app.route(\"\/api\/status\", methods=&#91;\"GET\"])<br><br>## Retour JSON<br>return jsonify({\"status\": \"ok\"})<br><br>## Lire le JSON re\u00e7u<br>data = request.get_json()<br><br>## Tester avec curl<br>curl http:\/\/127.0.0.1:5000\/api\/status<br><br>curl -X POST http:\/\/127.0.0.1:5000\/api\/users \\<br>-H \"Content-Type: application\/json\" \\<br>-d '{\"nom\":\"alice\"}'<br><br>## Pare-feu UFW<br>sudo ufw allow 5000\/tcp<br><br>## Logs systemd<br>journalctl -u flask-api.service -f<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7. Fichiers importants<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Application Flask<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/projets\/flask-api\/app.py<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Environnement virtuel<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/projets\/flask-api\/venv\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">D\u00e9pendances Python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/projets\/flask-api\/requirements.txt<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Logs applicatifs<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/projets\/flask-api\/logs\/api.log<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Service systemd<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/etc\/systemd\/system\/flask-api.service<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Configuration UFW<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/etc\/ufw\/user.rules<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">8. Configuration compl\u00e8te d\u2019une API Flask<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3<br># -*- coding: utf-8 -*-<br><br>from flask import Flask, jsonify, request<br>import logging<br>from logging.handlers import RotatingFileHandler<br><br>app = Flask(__name__)<br><br># Configuration des logs<br>handler = RotatingFileHandler(<br>    \"logs\/api.log\",<br>    maxBytes=1000000,<br>    backupCount=3<br>)<br><br>handler.setLevel(logging.INFO)<br><br>formatter = logging.Formatter(<br>    \"%(asctime)s %(levelname)s %(message)s\"<br>)<br><br>handler.setFormatter(formatter)<br><br>app.logger.addHandler(handler)<br><br># Base de donn\u00e9es temporaire<br>users = &#91;<br>    {\"id\": 1, \"nom\": \"alice\"},<br>    {\"id\": 2, \"nom\": \"bob\"}<br>]<br><br>@app.route(\"\/api\/status\", methods=&#91;\"GET\"])<br>def status():<br>    \"\"\"<br>    Retourne l'\u00e9tat de l'API.<br>    \"\"\"<br><br>    app.logger.info(\"Consultation du status API\")<br><br>    return jsonify({<br>        \"status\": \"ok\",<br>        \"service\": \"flask-api\"<br>    })<br><br>@app.route(\"\/api\/users\", methods=&#91;\"GET\"])<br>def get_users():<br>    \"\"\"<br>    Retourne la liste des utilisateurs.<br>    \"\"\"<br><br>    app.logger.info(\"Lecture des utilisateurs\")<br><br>    return jsonify(users)<br><br>@app.route(\"\/api\/users\", methods=&#91;\"POST\"])<br>def add_user():<br>    \"\"\"<br>    Ajoute un utilisateur.<br>    \"\"\"<br><br>    data = request.get_json()<br><br>    if not data or \"nom\" not in data:<br>        return jsonify({<br>            \"erreur\": \"Champ nom manquant\"<br>        }), 400<br><br>    user = {<br>        \"id\": len(users) + 1,<br>        \"nom\": data&#91;\"nom\"]<br>    }<br><br>    users.append(user)<br><br>    app.logger.info(f\"Ajout utilisateur : {data&#91;'nom']}\")<br><br>    return jsonify(user), 201<br><br>@app.route(\"\/api\/users\/&lt;int:user_id&gt;\", methods=&#91;\"DELETE\"])<br>def delete_user(user_id):<br>    \"\"\"<br>    Supprime un utilisateur.<br>    \"\"\"<br><br>    global users<br><br>    users = &#91;<br>        user for user in users<br>        if user&#91;\"id\"] != user_id<br>    ]<br><br>    app.logger.warning(f\"Suppression utilisateur ID {user_id}\")<br><br>    return jsonify({<br>        \"message\": \"Utilisateur supprim\u00e9\"<br>    })<br><br>if __name__ == \"__main__\":<br>    app.run(<br>        host=\"0.0.0.0\",<br>        port=5000,<br>        debug=False<br>    )<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">9. Comprendre le code Flask en d\u00e9tail<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">9.1 Cr\u00e9er l\u2019application Flask<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>app = Flask(__name__)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette ligne initialise l\u2019application web.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.2 D\u00e9finir une route<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.route(\"\/api\/status\", methods=&#91;\"GET\"])<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\/api\/status<\/code> : URL appel\u00e9e ;<\/li>\n\n\n\n<li><code>methods=[\"GET\"]<\/code> : m\u00e9thodes HTTP autoris\u00e9es.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">9.3 Retourner du JSON<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>return jsonify({<br>    \"status\": \"ok\"<br>})<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>jsonify()<\/code> transforme automatiquement les donn\u00e9es Python en JSON.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.4 Lire des donn\u00e9es JSON<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>data = request.get_json()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette m\u00e9thode lit le contenu JSON envoy\u00e9 par le client.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.5 Utiliser les codes HTTP<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>return jsonify(data), 201<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Code HTTP courant :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Code<\/th><th>Signification<\/th><\/tr><\/thead><tbody><tr><td>200<\/td><td>Succ\u00e8s<\/td><\/tr><tr><td>201<\/td><td>Ressource cr\u00e9\u00e9e<\/td><\/tr><tr><td>400<\/td><td>Mauvaise requ\u00eate<\/td><\/tr><tr><td>401<\/td><td>Non authentifi\u00e9<\/td><\/tr><tr><td>403<\/td><td>Acc\u00e8s interdit<\/td><\/tr><tr><td>404<\/td><td>Ressource absente<\/td><\/tr><tr><td>500<\/td><td>Erreur serveur<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">10. Tester l\u2019API<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">10.1 D\u00e9marrer Flask<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 app.py<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Par d\u00e9faut Flask \u00e9coute sur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0.0.0.0:5000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Port utilis\u00e9 :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TCP 5000<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10.2 Tester avec curl<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Lire le status<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>curl http:\/\/127.0.0.1:5000\/api\/status<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Lire les utilisateurs<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>curl http:\/\/127.0.0.1:5000\/api\/users<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ajouter un utilisateur<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST http:\/\/127.0.0.1:5000\/api\/users \\<br>-H \"Content-Type: application\/json\" \\<br>-d '{\"nom\":\"charlie\"}'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Explications :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-X POST<\/code> : m\u00e9thode HTTP ;<\/li>\n\n\n\n<li><code>-H<\/code> : ajoute un header HTTP ;<\/li>\n\n\n\n<li><code>-d<\/code> : envoie des donn\u00e9es.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">11. G\u00e9rer les m\u00e9thodes HTTP<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>M\u00e9thode<\/th><th>Utilisation<\/th><\/tr><\/thead><tbody><tr><td>GET<\/td><td>Lire<\/td><\/tr><tr><td>POST<\/td><td>Ajouter<\/td><\/tr><tr><td>PUT<\/td><td>Modifier<\/td><\/tr><tr><td>DELETE<\/td><td>Supprimer<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple PUT :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.route(\"\/api\/users\/&lt;int:user_id&gt;\", methods=&#91;\"PUT\"])<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">12. Utiliser des param\u00e8tres et du JSON<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Param\u00e8tre dans l\u2019URL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@app.route(\"\/api\/users\/&lt;int:user_id&gt;\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flask r\u00e9cup\u00e8re automatiquement :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def get_user(user_id):<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Param\u00e8tre GET<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/api\/search?nom=alice<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lecture :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>request.args.get(\"nom\")<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">13. S\u00e9curiser une API Flask<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">13.1 D\u00e9sactiver le mode debug<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ne laisse jamais :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>debug=True<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">en production.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le mode debug expose des informations sensibles.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">13.2 Utiliser Gunicorn<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Installation :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install gunicorn<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9marrage :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gunicorn -w 4 -b 0.0.0.0:5000 app:app<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Explications :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-w 4<\/code> : 4 workers ;<\/li>\n\n\n\n<li><code>-b<\/code> : adresse d\u2019\u00e9coute.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">13.3 Utiliser un reverse proxy Nginx<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Architecture recommand\u00e9e :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Internet<br>   |<br>Nginx :80 \/ :443<br>   |<br>Gunicorn :5000<br>   |<br>Flask<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">13.4 Ajouter une authentification simple<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple avec un token :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>API_TOKEN = \"super-token\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e9rification :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>token = request.headers.get(\"Authorization\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">13.5 Limiter l\u2019exposition r\u00e9seau<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si l\u2019API reste locale :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>host=\"127.0.0.1\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ainsi Flask n\u2019\u00e9coute pas sur le r\u00e9seau.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">14. Configurer le pare-feu UFW<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Autoriser le port Flask<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 5000\/tcp<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">V\u00e9rifier les r\u00e8gles<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw status verbose<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Supprimer une r\u00e8gle<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw delete allow 5000\/tcp<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cas recommand\u00e9 en production<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si Nginx sert de reverse proxy :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 80\/tcp<br>sudo ufw allow 443\/tcp<br>sudo ufw deny 5000\/tcp<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans ce cas :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Internet acc\u00e8de \u00e0 Nginx ;<\/li>\n\n\n\n<li>Flask reste inaccessible directement.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">15. Superviser et analyser les logs<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">15.1 Logs Flask<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fichier :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>logs\/api.log<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-05-22 15:00:10 INFO Lecture des utilisateurs<br>2026-05-22 15:01:12 WARNING Suppression utilisateur ID 2<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">15.2 Lire les logs en direct<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>tail -f logs\/api.log<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-f<\/code> suit le fichier en temps r\u00e9el.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">15.3 Logs systemd<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er un service<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fichier :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/etc\/systemd\/system\/flask-api.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Contenu :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]<br>Description=API Flask<br>After=network.target<br><br>&#91;Service]<br>User=www-data<br>WorkingDirectory=\/home\/user\/projets\/flask-api<br>ExecStart=\/home\/user\/projets\/flask-api\/venv\/bin\/gunicorn -w 4 -b 0.0.0.0:5000 app:app<br>Restart=always<br><br>&#91;Install]<br>WantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Activer le service<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl daemon-reload<br>sudo systemctl enable flask-api<br>sudo systemctl start flask-api<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Lire les logs<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>journalctl -u flask-api -f<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ce que tu peux analyser<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tu peux observer :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>les erreurs Python ;<\/li>\n\n\n\n<li>les crashs ;<\/li>\n\n\n\n<li>les connexions ;<\/li>\n\n\n\n<li>les red\u00e9marrages ;<\/li>\n\n\n\n<li>les erreurs r\u00e9seau ;<\/li>\n\n\n\n<li>les probl\u00e8mes de permissions.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">16. Commandes utiles et d\u00e9pannage<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">V\u00e9rifier l\u2019\u00e9coute r\u00e9seau<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ss -tulpn | grep 5000<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-t<\/code> : TCP ;<\/li>\n\n\n\n<li><code>-u<\/code> : UDP ;<\/li>\n\n\n\n<li><code>-l<\/code> : ports en \u00e9coute ;<\/li>\n\n\n\n<li><code>-p<\/code> : processus ;<\/li>\n\n\n\n<li><code>-n<\/code> : affichage num\u00e9rique.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tester le port<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>nc -vz 127.0.0.1 5000<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">V\u00e9rifier les processus Python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ps aux | grep python<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">V\u00e9rifier Gunicorn<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status flask-api<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">V\u00e9rifier le pare-feu<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw status numbered<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">17. Cas concrets d\u2019utilisation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">API de supervision<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un Raspberry Pi peut envoyer :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>temp\u00e9rature ;<\/li>\n\n\n\n<li>charge CPU ;<\/li>\n\n\n\n<li>\u00e9tat r\u00e9seau.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">API pour application mobile<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Une application Android peut :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>lire des utilisateurs ;<\/li>\n\n\n\n<li>ajouter des donn\u00e9es ;<\/li>\n\n\n\n<li>r\u00e9cup\u00e9rer des notifications.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">API pour WordPress<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress peut communiquer avec Flask afin de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>r\u00e9cup\u00e9rer des statistiques ;<\/li>\n\n\n\n<li>g\u00e9rer un inventaire ;<\/li>\n\n\n\n<li>afficher des donn\u00e9es temps r\u00e9el.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">18. Erreurs fr\u00e9quentes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Port d\u00e9j\u00e0 utilis\u00e9<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erreur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Address already in use<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Diagnostic :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ss -tulpn | grep 5000<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Module Flask absent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erreur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ModuleNotFoundError: No module named 'flask'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Correction :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install flask<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">JSON invalide<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Erreur HTTP :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>400 Bad Request<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cause :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JSON mal form\u00e9 ;<\/li>\n\n\n\n<li>header absent.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Permissions insuffisantes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e9rifie :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -l<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">19. Bonnes pratiques<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>utilise toujours un environnement virtuel Python ;<\/li>\n\n\n\n<li>place Flask derri\u00e8re Nginx ;<\/li>\n\n\n\n<li>active HTTPS ;<\/li>\n\n\n\n<li>d\u00e9sactive le mode debug ;<\/li>\n\n\n\n<li>journalise les actions importantes ;<\/li>\n\n\n\n<li>limite les ports ouverts ;<\/li>\n\n\n\n<li>valide les donn\u00e9es re\u00e7ues ;<\/li>\n\n\n\n<li>utilise des codes HTTP coh\u00e9rents ;<\/li>\n\n\n\n<li>s\u00e9pare d\u00e9veloppement et production ;<\/li>\n\n\n\n<li>stocke les secrets dans des variables d\u2019environnement.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">20. Pour aller plus loin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tu peux approfondir :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flask-RESTX ;<\/li>\n\n\n\n<li>Flask-SQLAlchemy ;<\/li>\n\n\n\n<li>JWT ;<\/li>\n\n\n\n<li>OAuth2 ;<\/li>\n\n\n\n<li>Docker ;<\/li>\n\n\n\n<li>Kubernetes ;<\/li>\n\n\n\n<li>Swagger\/OpenAPI ;<\/li>\n\n\n\n<li>PostgreSQL ;<\/li>\n\n\n\n<li>Redis ;<\/li>\n\n\n\n<li>Celery.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">21. Liens utiles et documentation officielle<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Documentation officielle Flask<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/flask.palletsprojects.com\/en\/stable\">https:\/\/flask.palletsprojects.com\/en\/stable<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Documentation principale du framework Flask. Tu y trouveras les routes, le JSON, les blueprints et les bonnes pratiques.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">D\u00e9ploiement Gunicorn<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/docs.gunicorn.org\/en\/stable\/run.html\">https:\/\/docs.gunicorn.org\/en\/stable\/run.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Documentation officielle de Gunicorn pour comprendre le fonctionnement des workers et du binding r\u00e9seau.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Documentation UFW Ubuntu<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/ubuntu.com\/server\/docs\/security-firewall\">https:\/\/ubuntu.com\/server\/docs\/security-firewall<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Guide officiel Ubuntu pour configurer UFW correctement.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Documentation systemd Debian<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/systemd.service.html\">https:\/\/www.freedesktop.org\/software\/systemd\/man\/systemd.service.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Documentation officielle des services systemd.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Documentation curl<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/curl.se\/docs\/manpage.html\">https:\/\/curl.se\/docs\/manpage.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9f\u00e9rence compl\u00e8te des options <code>curl<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">OpenClassrooms \u2014 D\u00e9couvrez les API REST<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/openclassrooms.com\/fr\/courses\/6228236-demarrez-votre-projet-avec-python\">https:\/\/openclassrooms.com\/fr\/courses\/6228236-demarrez-votre-projet-avec-python<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tr\u00e8s bon contenu p\u00e9dagogique pour d\u00e9buter les API en Python.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">OpenClassrooms \u2014 Apprenez \u00e0 programmer en Python<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/openclassrooms.com\/fr\/courses\/235344-apprenez-a-programmer-en-python\">https:\/\/openclassrooms.com\/fr\/courses\/235344-apprenez-a-programmer-en-python<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Permet de revoir les bases Python n\u00e9cessaires avant Flask.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mozilla Developer Network HTTP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/developer.mozilla.org\/fr\/docs\/Web\/HTTP\">https:\/\/developer.mozilla.org\/fr\/docs\/Web\/HTTP<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Excellente r\u00e9f\u00e9rence francophone sur HTTP et les codes de retour.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">RFC HTTP\/1.1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc9110\">https:\/\/datatracker.ietf.org\/doc\/html\/rfc9110<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9f\u00e9rence officielle du protocole HTTP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">22. Propositions de TP<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">TP 1 \u2014 Cr\u00e9er une API de supervision<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Objectif :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cr\u00e9er une route <code>\/api\/status<\/code> ;<\/li>\n\n\n\n<li>retourner un JSON ;<\/li>\n\n\n\n<li>journaliser les acc\u00e8s.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">TP 2 \u2014 Ajouter une gestion utilisateurs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Objectif :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ajouter un utilisateur ;<\/li>\n\n\n\n<li>modifier un utilisateur ;<\/li>\n\n\n\n<li>supprimer un utilisateur ;<\/li>\n\n\n\n<li>utiliser GET\/POST\/PUT\/DELETE.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">TP 3 \u2014 D\u00e9ployer Flask avec Gunicorn<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Objectif :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>installer Gunicorn ;<\/li>\n\n\n\n<li>cr\u00e9er un service systemd ;<\/li>\n\n\n\n<li>superviser les logs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">TP 4 \u2014 Ajouter Nginx<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Objectif :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mettre Flask derri\u00e8re Nginx ;<\/li>\n\n\n\n<li>activer HTTPS ;<\/li>\n\n\n\n<li>s\u00e9curiser le port 5000.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">TP 5 \u2014 Cr\u00e9er une API pour Raspberry Pi<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Objectif :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>envoyer des donn\u00e9es JSON ;<\/li>\n\n\n\n<li>stocker des mesures ;<\/li>\n\n\n\n<li>afficher les donn\u00e9es via une route Flask.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction Dans un BTS CIEL ou SIO, tu vas tr\u00e8s souvent d\u00e9velopper ou interfacer des services web. Aujourd\u2019hui, presque toutes les applications communiquent gr\u00e2ce \u00e0 des API REST. Un serveur web, une application mobile, un outil de supervision ou un portail m\u00e9tier utilisent g\u00e9n\u00e9ralement des \u00e9changes HTTP au format JSON. Flask permet de cr\u00e9er [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[29,30],"tags":[31],"class_list":["post-405","post","type-post","status-publish","format-standard","hentry","category-administration-systeme","category-api","tag-flask"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Fiche API avec flask - Eryann Breizh SecOps<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fiche API avec flask - Eryann Breizh SecOps\" \/>\n<meta property=\"og:description\" content=\"1. Introduction Dans un BTS CIEL ou SIO, tu vas tr\u00e8s souvent d\u00e9velopper ou interfacer des services web. Aujourd\u2019hui, presque toutes les applications communiquent gr\u00e2ce \u00e0 des API REST. Un serveur web, une application mobile, un outil de supervision ou un portail m\u00e9tier utilisent g\u00e9n\u00e9ralement des \u00e9changes HTTP au format JSON. Flask permet de cr\u00e9er [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/\" \/>\n<meta property=\"og:site_name\" content=\"Eryann Breizh SecOps\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-22T14:00:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-22T14:00:38+00:00\" \/>\n<meta name=\"author\" content=\"wpadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"wpadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/\"},\"author\":{\"name\":\"wpadmin\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/#\\\/schema\\\/person\\\/d2ee98d2385cd045ed4fe1c07ca320b5\"},\"headline\":\"Fiche API avec flask\",\"datePublished\":\"2026-05-22T14:00:35+00:00\",\"dateModified\":\"2026-05-22T14:00:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/\"},\"wordCount\":1300,\"publisher\":{\"@id\":\"https:\\\/\\\/eryann.fr\\\/#organization\"},\"keywords\":[\"flask\"],\"articleSection\":[\"Administration syst\u00e8me\",\"api\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/\",\"url\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/\",\"name\":\"Fiche API avec flask - Eryann Breizh SecOps\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/eryann.fr\\\/#website\"},\"datePublished\":\"2026-05-22T14:00:35+00:00\",\"dateModified\":\"2026-05-22T14:00:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/administration-systeme\\\/fiche-api-avec-flask\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/eryann.fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fiche API avec flask\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/#website\",\"url\":\"https:\\\/\\\/eryann.fr\\\/\",\"name\":\"Eryann Breizh SecOps\",\"description\":\"Fiches techniques &amp; labs en syst\u00e8mes et r\u00e9seaux poor les \u00e9tudiants en BTS CEIL ET SIO\",\"publisher\":{\"@id\":\"https:\\\/\\\/eryann.fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/eryann.fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/#organization\",\"name\":\"Breizh Sec Ops\",\"url\":\"https:\\\/\\\/eryann.fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/eryann.fr\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/cropped-088112b9-fd28-4b18-b02d-4d9dded3e900-e1777846396685.png\",\"contentUrl\":\"https:\\\/\\\/eryann.fr\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/cropped-088112b9-fd28-4b18-b02d-4d9dded3e900-e1777846396685.png\",\"width\":1246,\"height\":229,\"caption\":\"Breizh Sec Ops\"},\"image\":{\"@id\":\"https:\\\/\\\/eryann.fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/eryann.fr\\\/#\\\/schema\\\/person\\\/d2ee98d2385cd045ed4fe1c07ca320b5\",\"name\":\"wpadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d71b4031c3d015de3ca68c137413277e548b331b07db0acf781b9379b798eb3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d71b4031c3d015de3ca68c137413277e548b331b07db0acf781b9379b798eb3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d71b4031c3d015de3ca68c137413277e548b331b07db0acf781b9379b798eb3e?s=96&d=mm&r=g\",\"caption\":\"wpadmin\"},\"sameAs\":[\"https:\\\/\\\/eryann.fr\"],\"url\":\"https:\\\/\\\/eryann.fr\\\/index.php\\\/author\\\/wpadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fiche API avec flask - Eryann Breizh SecOps","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/","og_locale":"fr_FR","og_type":"article","og_title":"Fiche API avec flask - Eryann Breizh SecOps","og_description":"1. Introduction Dans un BTS CIEL ou SIO, tu vas tr\u00e8s souvent d\u00e9velopper ou interfacer des services web. Aujourd\u2019hui, presque toutes les applications communiquent gr\u00e2ce \u00e0 des API REST. Un serveur web, une application mobile, un outil de supervision ou un portail m\u00e9tier utilisent g\u00e9n\u00e9ralement des \u00e9changes HTTP au format JSON. Flask permet de cr\u00e9er [&hellip;]","og_url":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/","og_site_name":"Eryann Breizh SecOps","article_published_time":"2026-05-22T14:00:35+00:00","article_modified_time":"2026-05-22T14:00:38+00:00","author":"wpadmin","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"wpadmin","Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/#article","isPartOf":{"@id":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/"},"author":{"name":"wpadmin","@id":"https:\/\/eryann.fr\/#\/schema\/person\/d2ee98d2385cd045ed4fe1c07ca320b5"},"headline":"Fiche API avec flask","datePublished":"2026-05-22T14:00:35+00:00","dateModified":"2026-05-22T14:00:38+00:00","mainEntityOfPage":{"@id":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/"},"wordCount":1300,"publisher":{"@id":"https:\/\/eryann.fr\/#organization"},"keywords":["flask"],"articleSection":["Administration syst\u00e8me","api"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/","url":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/","name":"Fiche API avec flask - Eryann Breizh SecOps","isPartOf":{"@id":"https:\/\/eryann.fr\/#website"},"datePublished":"2026-05-22T14:00:35+00:00","dateModified":"2026-05-22T14:00:38+00:00","breadcrumb":{"@id":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/eryann.fr\/index.php\/administration-systeme\/fiche-api-avec-flask\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/eryann.fr\/"},{"@type":"ListItem","position":2,"name":"Fiche API avec flask"}]},{"@type":"WebSite","@id":"https:\/\/eryann.fr\/#website","url":"https:\/\/eryann.fr\/","name":"Eryann Breizh SecOps","description":"Fiches techniques &amp; labs en syst\u00e8mes et r\u00e9seaux poor les \u00e9tudiants en BTS CEIL ET SIO","publisher":{"@id":"https:\/\/eryann.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/eryann.fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/eryann.fr\/#organization","name":"Breizh Sec Ops","url":"https:\/\/eryann.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/eryann.fr\/#\/schema\/logo\/image\/","url":"https:\/\/eryann.fr\/wp-content\/uploads\/2026\/05\/cropped-088112b9-fd28-4b18-b02d-4d9dded3e900-e1777846396685.png","contentUrl":"https:\/\/eryann.fr\/wp-content\/uploads\/2026\/05\/cropped-088112b9-fd28-4b18-b02d-4d9dded3e900-e1777846396685.png","width":1246,"height":229,"caption":"Breizh Sec Ops"},"image":{"@id":"https:\/\/eryann.fr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/eryann.fr\/#\/schema\/person\/d2ee98d2385cd045ed4fe1c07ca320b5","name":"wpadmin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/d71b4031c3d015de3ca68c137413277e548b331b07db0acf781b9379b798eb3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d71b4031c3d015de3ca68c137413277e548b331b07db0acf781b9379b798eb3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d71b4031c3d015de3ca68c137413277e548b331b07db0acf781b9379b798eb3e?s=96&d=mm&r=g","caption":"wpadmin"},"sameAs":["https:\/\/eryann.fr"],"url":"https:\/\/eryann.fr\/index.php\/author\/wpadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/posts\/405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/comments?post=405"}],"version-history":[{"count":1,"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/posts\/405\/revisions"}],"predecessor-version":[{"id":406,"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/posts\/405\/revisions\/406"}],"wp:attachment":[{"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/media?parent=405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/categories?post=405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eryann.fr\/index.php\/wp-json\/wp\/v2\/tags?post=405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}