Python: Création d'une API REST

Guide étape par étape pour bâtir une API REST avec Flask en Python

👋 Bienvenue dans la documentation Stackhero !

Stackhero offre une solution Python cloud clé en main conçue pour simplifier vos déploiements :

  • Déployez votre application en production en quelques secondes grâce à un simple git push.
  • Utilisez votre propre nom de domaine, avec une configuration automatique du certificat HTTPS pour des connexions sécurisées gérées pour vous.
  • Profitez de sauvegardes automatiques, de mises à jour en un clic et d'une tarification prévisible, afin que vous puissiez vous concentrer sur votre code plutôt que sur la gestion de l'infrastructure.
  • Bénéficiez d'une performance et d'une sécurité accrues sur une infrastructure privée et dédiée. Votre environnement est isolé et protégé.

Gagnez du temps et simplifiez votre workflow : votre code peut être en ligne avec l'hébergement Python cloud de Stackhero en seulement 5 minutes.

Ce guide vous explique comment créer une API REST simple en utilisant Python et Flask. Flask est un micro-framework léger qui facilite la création rapide d'applications web et d'APIs.

Avant de commencer, assurez-vous d'avoir installé les outils suivants :

  1. Python
  2. pip
  3. git
  4. asdf

Si vous avez besoin d'aide pour configurer votre environnement, consultez le guide Development platform. Vous pouvez aussi commencer à coder immédiatement avec la plateforme en ligne Code-Hero. Code-Hero offre un IDE et un terminal en ligne, avec tous les outils essentiels déjà installés. Cela vous permet de vous concentrer sur votre code plutôt que sur l'installation et la configuration.

API REST Python exécutée dans Code-Hero, accessible directement depuis le navigateurAPI REST Python exécutée dans Code-Hero, accessible directement depuis le navigateur

Commencez par créer un nouveau dossier de projet. Dans cet exemple, le projet s'appelle myRestApi :

mkdir myRestApi
cd myRestApi

Définissez la version de Python sur la plus récente disponible avec asdf, puis initialisez un dépôt Git :

asdf install python latest \
  && asdf local python latest

echo "__pycache__/" >> .gitignore

git init
git add -A .
git commit -m "First commit"

Vous n'avez besoin que d'une seule dépendance principale pour cet exemple : Flask.

Flask est conçu pour être simple et rapide, afin que vous puissiez créer et déployer des APIs web sans surcharge inutile. Il intègre nativement la gestion du routage, des templates et des requêtes HTTP, ce qui vous permet de passer de l'idée à une API fonctionnelle en quelques minutes.

Vous pouvez installer Flask et python-dotenv avec pip :

pip install Flask python-dotenv

Nous incluons python-dotenv pour gérer les variables d'environnement de façon sécuritaire et pratique. Vous verrez son utilisation dans les étapes suivantes.

Après l'installation, figez vos dépendances dans un fichier requirements.txt :

pip freeze > requirements.txt

Figer les dépendances garantit que tout le monde utilise les mêmes versions de packages. Ce petit geste peut vous éviter des heures de dépannage plus tard.

Vous êtes maintenant prêt à écrire le code de votre API.

Créez un fichier nommé app.py et ajoutez ce code :

import os
from dotenv import load_dotenv
from flask import Flask, jsonify, request

# Charger les variables d'environnement depuis .env pour les environnements hors production
if os.environ.get('ENV') != 'production':
    load_dotenv()

app = Flask(__name__)

# Exemple de données de tâches
tasks = [
    {
        'id': 1,
        'title': 'Buy groceries',
        'description': 'Milk, Cheese, Pizza, Fruits',
        'done': False
    },
    {
        'id': 2,
        'title': 'Learn Python',
        'description': 'Learn Python programming basics',
        'done': False
    }
]

@app.route('/api/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

@app.route('/api/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = [task for task in tasks if task['id'] == task_id]
    if not task:
        return jsonify({'error': 'Task not found'}), 404
    return jsonify({'task': task[0]})

@app.route('/api/tasks', methods=['POST'])
def create_task():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': 'Title is required'}), 400
    task = {
        'id': tasks[-1]['id'] + 1,
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
    }
    tasks.append(task)
    return jsonify({'task': task}), 201

if __name__ == '__main__':
    if os.environ.get('ENV') == 'production':
        app.run()
    else:
        app.run(host='0.0.0.0', port=8080, debug=True)

Vous pouvez démarrer le serveur avec :

python app.py

Avec host='0.0.0.0', votre API est accessible via votre navigateur lorsque vous utilisez Code-Hero. Rendez-vous sur http://<XXXXXX>.stackhero-network.com:8080/api/tasks, en remplaçant <XXXXXX> par votre domaine Code-Hero.

Une fois le serveur lancé, vous pouvez interagir avec votre API en utilisant cURL. Voici quelques exemples de commandes :

  • Récupérer toutes les tâches :

    curl -s http://localhost:8080/api/tasks
    # Output:
    # {
    #   "tasks": [
    #     ...
    #   ]
    # }
    
  • Récupérer une tâche spécifique (ID 2) :

    curl -s http://localhost:8080/api/tasks/2
    # Output:
    # {
    #   "task": {
    #     ...
    #   }
    # }
    
  • Créer une nouvelle tâche :

    curl -s -X POST -H "Content-Type: application/json" \
    -d '{"title": "New task", "description": "Created with cURL"}' \
    http://localhost:8080/api/tasks
    # Output:
    # {
    #   "task": {
    #     ...
    #   }
    # }
    

Astuce : Pour un affichage plus lisible, vous pouvez passer le résultat à jq. Par exemple, curl -s http://localhost:8080/api/tasks/2 | jq rend le JSON plus facile à lire.

Exemple d'API REST Python avec Flask, exécutée dans Stackhero Code-Hero, avec le serveur (1) et le client utilisant cURL (2)Exemple d'API REST Python avec Flask, exécutée dans Stackhero Code-Hero, avec le serveur (1) et le client utilisant cURL (2)

Les variables d'environnement vous aident à protéger des secrets comme les mots de passe de base de données ou les clés API. Leur utilisation permet de garder les données sensibles hors de votre code source et de l'historique Git, et facilite la gestion de paramètres différents selon l'environnement.

Pour gérer les variables d'environnement, vous pouvez utiliser le module python-dotenv. Si vous avez sauté l'étape d'installation précédente, vous pouvez l'installer maintenant :

pip install python-dotenv
pip freeze > requirements.txt

Créez un fichier .env à la racine de votre projet et ajoutez vos variables d'environnement de développement :

ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"

Ajoutez .env à votre .gitignore pour éviter de le committer dans Git :

echo ".env" >> .gitignore

Vous pouvez accéder à ces variables dans Python avec os.environ.get() :

import os

print(os.environ.get('ENV'))

Le fichier .env est réservé au développement. Pour la production ou le staging, vous pouvez définir les variables d'environnement directement dans votre tableau de bord Stackhero, dans la configuration de votre service Python.

Le serveur intégré de Flask est idéal pour le développement. En production, il est recommandé d'utiliser un serveur WSGI robuste comme Gunicorn. Voici comment vous préparer :

  1. Installez Gunicorn :

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. Lancez votre application avec Gunicorn :

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    

    Ici, app:app fait référence à votre fichier (app.py) et à l'instance de l'application Flask (app).

  3. Vous pouvez ajouter un Makefile pour basculer facilement entre les modes développement et production :

    .DEFAULT_GOAL := dev
    
    # Stackhero for Python exécute la règle "run" par défaut. Nous la redéfinissons pour lancer 'prod'.
    run: prod
    
    prod:
    	ENV=production gunicorn app:app \
    	  --error-logfile - \
    	  -b 0.0.0.0:8080
    
    dev:
    	python app.py
    

Vous pouvez démarrer le serveur en mode développement avec make dev (ou simplement make), ou en mode production avec make prod.

Stackhero simplifie et sécurise le déploiement cloud. Vous pouvez déployer votre projet Python avec le service Python cloud hosting. Les fonctionnalités incluent :

  • Déploiement par simple git push
  • TLS (HTTPS) automatique avec domaines personnalisables
  • Infrastructure dédiée pour la sécurité
  • Support de HTTP/2, TLS 1.3, WebSockets, GZIP & Brotli, ETag, et accès aux ports TCP/UDP

Pour déployer, suivez ces étapes :

  1. Récupérez votre clé publique SSH :

    cat ~/.ssh/id_*.pub
    
  2. Dans le tableau de bord Stackhero, ouvrez votre service "Stackhero for Python" et sélectionnez "Configurer".

  3. Collez votre clé publique dans le champ "SSH public keys" ou "Key".

  4. Cliquez sur "Valider" pour confirmer votre configuration.

Configuration de la clé publique pour "Stackhero for Python"Configuration de la clé publique pour "Stackhero for Python"

Si vous n'avez pas encore de clés SSH, vous pouvez les générer avec :

ssh-keygen -t ed25519

Ajoutez un remote Git à votre projet avec la commande fournie dans votre service Stackhero (remplacez <XXXXXX> par le domaine de votre service) :

git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git

Commande Git remoteCommande Git remote

Lorsque vous êtes prêt à déployer, poussez votre code avec :

git push stackhero main

Pensez à committer vos modifications avant de déployer. Dans Stackhero Code-Hero, vous pouvez utiliser la Command Palette (Ctrl+Shift+P ou Cmd+Shift+P) et taper Git: Commit pour des commits rapides.

Après le déploiement, votre API est disponible à l'adresse https://<XXXXXX>.stackhero-network.com/api/tasks. Remplacez <XXXXXX> par le domaine de votre service pour accéder à votre API Flask.

Vous disposez maintenant d'une API REST fonctionnelle bâtie avec Flask. Avec cette base, il est facile de faire évoluer votre application, de la connecter à des bases de données ou de l'intégrer à d'autres services. Flask vous offre la flexibilité nécessaire pour passer d'un simple prototype à une API de production complète.