all
Business
data science
design
development
our journey
Strategy Pattern
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Comment créer une API Flask avec Python : le guide complet

Laptop screen showing lines of code

Flacon est un framework Web Python léger couramment utilisé pour créer des API REST et des microservices. Son cœur minimal et son architecture flexible permettent aux développeurs de concevoir des API sans être contraints par des structures de projet strictes.

Dans ce guide, vous allez créer une API REST simple à l'aide de Flask, notamment :

  • Points de terminaison CRUD
  • une base de données SQLite avec SQLAlchemy
  • validation des demandes et gestion des erreurs
  • Documentation OpenAPI
  • une structure de projet modulaire

À la fin de ce didacticiel, vous comprendrez comment concevoir et structurer une API Flask prête pour la production.

blue arrow to the left
Imaginary Cloud logo

Qu'est-ce que Flask et pourquoi l'utiliser pour créer des API ?

Flask est un framework Web Python léger utilisé pour créer des API et des applications Web en définissant des routes HTTP qui renvoient des réponses JSON ou HTML.

Un framework est une bibliothèque utilisée par les développeurs pour créer et gérer des applications Web fiables et évolutives. Il existe plusieurs cadres disponible pour Python, comme Tornado, Pyramid et, bien sûr, Django (qui est souvent comparé à Flask).

Flask est un microframework Python pour développement web. Bien qu'il soit construit avec un petit cœur et considéré comme une interface de passerelle de serveur Web (WSGI) très légère, Flask se distingue par sa philosophie facile à étendre. Il a été conçu pour s'adapter à des applications complexes et pour permettre un démarrage facile et rapide.

De plus, un autre avantage important de Flask est sa fonctionnalité. Même s'il propose des suggestions, Flask n'exige pas obligatoirement de mises en page de projet ou d'autres dépendances. Au lieu de cela, il permet aux développeurs de choisir les bibliothèques et les outils qu'ils souhaitent utiliser et propose en outre divers extensions disponibles, qui sont fournis par la communauté.

blue arrow to the left
Imaginary Cloud logo

Qu'est-ce qu'une API REST et comment fonctionne-t-elle ?

API est un acronyme de Application Programming Interface, ce qui signifie qu'il s'agit essentiellement la façon dont vous communiquez avec une application. Une API REST (Representational State Transfer) permet la communication entre les systèmes à l'aide de méthodes HTTP standard et correspond à un style architectural qui vise les communications sans état et sépare les préoccupations relatives aux clients et aux serveurs. Il échange généralement des données au format JSON et fonctionne à l'aide de points de terminaison correspondant à des actions telles que Créer (POST), Lire (GET), Mettre à jour (PUT ou PATCH) et Supprimer (DELETE). Les API REST sont largement utilisées pour leur simplicité, leur évolutivité et leur compatibilité avec un large éventail de clients et de plateformes.

Le API REST sur cet exercice créera une fausse implémentation de Actions CRUD au-dessus d'une entité. Une API avec CRUD permet les opérations de création, de lecture, de mise à jour et de suppression sur les éléments de l'application.

Comment créer une API REST à l'aide de Python Flask ?

Cet article vous guidera à travers les premières étapes pour créer une API REST à l'aide de Flask.

Ce que vous allez construire

Dans ce didacticiel, vous allez créer une API REST simple à l'aide de Flask et Python qui inclut :

  • une base de données SQLite connectée via SQLAlchemy
  • Points de terminaison CRUD pour la gestion des articles
  • validation des demandes et gestion des erreurs
  • documentation automatique de l'API à l'aide d'OpenAPI
  • une structure de projet modulaire pour la maintenabilité

Cet exemple présente les principaux composants nécessaires à la création d'une API backend prête à être utilisée en production.

Prescriptions techniques

Python doit être installé sur la machine actuelle. Le code présenté prendra en compte Python3. Si vous souhaitez utiliser Python2 et/ou si vous suivez cette procédure sur un ordinateur Windows, veuillez suivre les instructions présentées dans Guide d'installation du flacon.

Commençons par création d'un répertoire pour enregistrer le projet. Dans le répertoire dans lequel vous souhaitez placer votre projet, exécutez les commandes suivantes sur le shell :

Nous avons créé le flask_demo répertoire et l'a déplacé à l'intérieur. Avant de commencer à installer les dépendances, créons un environnement virtuel en exécutant la commande suivante :

Cela créera un dossier dans votre projet avec le nom .venv. Ensuite, nous devons activer l'environnement correspondant en exécutant :

Cela signifie que nous envisageons maintenant la environnement virtuel venv lors de l'exécution de n'importe quel code Python. Il peut être important de spécifier l'environnement que vous envisagez lorsque vous l'exécutez dans votre IDE.

Assurez-vous de respecter l'environnement actif avant de passer aux étapes suivantes. Vous pouvez vérifier si vous vous trouvez dans l'environnement en regardant sur le côté gauche de la console. Si le nom de l'environnement virtuel est entre parenthèses, vous êtes prêt à partir.

Si tu veux désactiver l'environnement, exécutez simplement la commande suivante :

Screenshot of Flask - venv virtual command environment.

Workflow de développement d'API

Un flux de travail de développement d'API Flask typique comprend :

  1. Configuration de l'application Flask.
  2. Définition des itinéraires et des points de terminaison des API.
  3. Connexion de l'application à une base de données.
  4. Mise en œuvre des opérations CRUD.
  5. Validation des demandes et gestion des erreurs
  6. Documentation de l'API à l'aide des outils OpenAPI.

Cette structure permet de garder les services dorsaux organisés et d'en faciliter la maintenance.

Créez une API Flask avec une vraie base de données

Dans l'exemple précédent, l'API stockait les données dans une liste Python. Bien que cela soit utile pour démontrer les points de terminaison CRUD, cela ne convient pas aux applications réelles car les données disparaissent chaque fois que le serveur redémarre.

Dans la pratique, les API stockent les données dans une base de données afin qu'elles persistent entre les demandes et les redémarrages de l'application. Dans cette section, nous utiliserons SQLite et SQL Alchimie pour créer une API simple basée sur une base de données.

SQLite est une base de données légère qui ne nécessite aucun serveur séparé, ce qui la rend idéale pour les didacticiels et les petites applications.

Installez SQLAlchemy et Flask-SQLAlchemy

Tout d'abord, installez les dépendances requises.

Exécutez la commande suivante :

pip install sqlalchemy flask-sqlalchemy

Si vous gérez les dépendances à l'aide d'un requirements.txt fichier, ajoutez :

Flask
sqlalchemy
flask-sqlalchemy

Dans cette configuration :

  • SQL Alchimie est le mappeur relationnel objet (ORM) utilisé pour interagir avec la base de données.
  • Alchimie Flask-SQL simplifie l'intégration entre Flask et SQLAlchemy.

Configuration de la base de données

Ensuite, configurez Flask pour qu'il se connecte à la base de données SQLite.

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///items.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db = SQLAlchemy(app)

Nous définissons ici la chaîne de connexion à la base de données :

sqlite : ///items.db

Cela crée un fichier de base de données SQLite local nommé items.db dans le répertoire du projet.

Définir le modèle de base de données

Créez ensuite un modèle représentant la structure de la table de base de données.

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    price = db.Column(db.Float, nullable=False)

    def to_dict(self):
        return {
            "id": self.id,
            "name": self.name,
            "price": self.price
        }

Le Article le modèle définit trois champs :

  • identifiant — identifiant unique pour chaque article
  • nom — le nom de l'article
  • prix — le prix de l'article

Le to_dict () La méthode convertit l'objet de base de données en un dictionnaire sérialisable JSON.

Création de la table de base de données

Avant d'exécuter l'API, créez les tables de base de données à l'aide de SQLAlchemy.

@app.route("/items", methods=["GET"])
def get_items():
    items = Item.query.all()
    return jsonify([item.to_dict() for item in items])

Ce point de terminaison récupère tous les éléments stockés dans la base de données.

Créer un nouvel article

@app.route("/items", methods=["POST"])
def create_item():
    data = request.get_json()

    if not data or "name" not in data or "price" not in data:
        return jsonify({"error": "Name and price are required"}), 400

    item = Item(name=data["name"], price=data["price"])
    db.session.add(item)
    db.session.commit()

    return jsonify(item.to_dict()), 201

Ce point final :

  1. lit le corps de la requête JSON
  2. valide la saisie
  3. crée un nouvel enregistrement de base de données
  4. renvoie l'élément créé

Obtenez un seul article

@app.route("/items/<int:item_id>", methods=["GET"])
def get_item(item_id):
    item = Item.query.get_or_404(item_id)
    return jsonify(item.to_dict())

Ce point de terminaison extrait un élément spécifique par son identifiant.

Si l'article n'existe pas, Flask renvoie automatiquement un Erreur 404.

Mettre à jour un article

@app.route("/items/<int:item_id>", methods=["PUT"])
def update_item(item_id):
    item = Item.query.get_or_404(item_id)
    data = request.get_json()

    if not data:
        return jsonify({"error": "Request body is required"}), 400

    item.name = data.get("name", item.name)
    item.price = data.get("price", item.price)

    db.session.commit()

    return jsonify(item.to_dict())

Ce point de terminaison met à jour un élément existant.

Seuls les champs fournis sont modifiés.

Supprimer un article

@app.route("/items/<int:item_id>", methods=["DELETE"])
def delete_item(item_id):
    item = Item.query.get_or_404(item_id)

    db.session.delete(item)
    db.session.commit()

    return jsonify({"message": "Item deleted successfully"})

Ce point de terminaison supprime l'élément spécifié de la base de données.

Exécutez l'application

Démarrez le serveur de développement Flask :

python app.py

Votre API sera désormais disponible localement.

Exemple de demande et de réponse

Créer un nouvel article

Demande :

{
  "name": "Keyboard",
  "price": 49.99
}

Réponse :

{
  "id": 1,
  "name": "Keyboard",
  "price": 49.99
}

Récupérez tous les objets

Réponse :

[
  {
    "id": 1,
    "name": "Keyboard",
    "price": 49.99
  }
]

Pourquoi utiliser une base de données au lieu d'une liste en mémoire ?

Les listes en mémoire sont utiles pour des démonstrations simples mais présentent plusieurs limites :

  • les données sont perdues au redémarrage de l'application
  • plusieurs instances d'applications ne peuvent pas partager de données
  • les données ne peuvent pas être interrogées efficacement

L'utilisation d'une base de données telle que SQLite permet à l'API de stocker et de récupérer des données persistantes, ce qui permet à l'application de se comporter davantage comme un véritable service backend.

Pour les systèmes de production, les développeurs utilisent généralement des bases de données telles que PostgreSQL, MySQL, ou MongoDB, mais la structure globale de l'API reste la même.

Structure pour débutants : un projet d'API Flask simple

Pour les petites applications ou les didacticiels, il est courant de conserver l'intégralité de l'API dans quelques fichiers seulement. Cette approche permet de garder la configuration simple et facile à comprendre.

Une structure d'API Flask pour débutant typique peut ressembler à ceci :

flask-api/
├── app.py
├── requirements.txt
├── models.py
├── routes.py
├── schemas.py
└── items.db

Dans cette structure :

  • app.py crée l'application Flask et configure les extensions.
  • models.py définit les modèles de base de données à l'aide de SQLAlchemy.
  • routes.py contient les points de terminaison de l'API.
  • requirements.txt répertorie les dépendances du projet.
  • items.db est la base de données SQLite utilisée pour le développement.

Cette mise en page est facile à suivre et convient parfaitement aux petites API, aux prototypes et aux projets d'apprentissage.

Cependant, au fur et à mesure que l'application grandit, cette structure peut devenir difficile à maintenir.

Exemple : contenu de chaque fichier

Pour faciliter la compréhension de la structure, voici comment chaque fichier peut être utilisé.

app.py

Ce fichier crée l'application Flask, configure la base de données et enregistre les itinéraires.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_smorest import Api

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)

    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///items.db"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    app.config["API_TITLE"] = "Flask API Demo"
    app.config["API_VERSION"] = "v1"
    app.config["OPENAPI_VERSION"] = "3.0.3"
    app.config["OPENAPI_URL_PREFIX"] = "/"
    app.config["OPENAPI_SWAGGER_UI_PATH"] = "/docs"
    app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"

    db.init_app(app)
    api = Api(app)

    from routes import blp
    api.register_blueprint(blp)

    with app.app_context():
        db.create_all()

    return app

app = create_app()

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

models.py

Ce fichier définit le modèle de base de données.

from app import db

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    price = db.Column(db.Float, nullable=False)

routes.py

Ce fichier contient les points de terminaison de l'API.

from flask.views import MethodView
from flask_smorest import Blueprint
from models import Item
from schemas import ItemSchema
from app import db

blp = Blueprint(
    "items",
    "items",
    url_prefix="/items",
    description="Operations on items"
)

@blp.route("/")
class ItemsResource(MethodView):

    @blp.response(200, ItemSchema(many=True))
    def get(self):
        return Item.query.all()

    @blp.arguments(ItemSchema)
    @blp.response(201, ItemSchema)
    def post(self, new_item):
        item = Item(**new_item)
        db.session.add(item)
        db.session.commit()
        return item

Pourquoi cette structure est meilleure

La séparation de l'application en fichiers présente plusieurs avantages :

  • cela permet de clarifier les responsabilités
  • cela facilite la maintenance du code
  • elle soutient la croissance future
  • il réduit l'encombrement dans le fichier principal de l'application

Par exemple, si vous ajoutez ultérieurement une authentification, des utilisateurs ou des commandes, vous pouvez développer la structure sans réécrire l'ensemble du projet.

Structure de production : une architecture d'API Flask modulaire

Les applications plus volumineuses bénéficient de l'organisation du code en packages. Cela permet de séparer les différentes parties du système, ce qui facilite la mise à l'échelle et la maintenance du projet.

Une structure d'API Flask plus prête pour la production pourrait ressembler à ceci :

Pour les projets plus importants, il est courant d'organiser le code dans des dossiers plutôt que dans des fichiers individuels de premier niveau.

Une structure plus évolutive pourrait ressembler à ceci :

flask-api/
├── app/
│   ├── __init__.py
│   ├── models/
│   │   └── item.py
│   ├── routes/
│   │   └── items.py
│   └── schemas/
│       └── item.py
├── requirements.txt
└── run.py

Dans cette architecture :

  • Le package d'applications contient la logique principale de l'application.
  • modèles/ définit les modèles de base de données.
  • itinéraires/ contient des points de terminaison d'API regroupés par ressource.
  • schémas/ définit la validation des demandes et des réponses à l'aide de Marshmallow.
  • run.py lance l'application Flask.

Cette approche modulaire permet de :

  • gérer de grandes bases de code
  • organiser les terminaux par ressource
  • ajouter de nouvelles fonctionnalités telles que l'authentification ou les tâches en arrière-plan
  • collaborer avec d'autres développeurs

Meilleure pratique

Lorsque vous créez une API Flask, il est judicieux de commencer par une structure simple et de ne l'étendre que lorsque l'application se développe. Pour les petits projets, quelques fichiers clairement nommés suffisent souvent. Pour les API plus volumineuses, le passage à une mise en page basée sur des packages facilite grandement la maintenance.

Une structure de projet claire aide les autres développeurs à comprendre rapidement le code et facilite l'extension de l'application à l'avenir.

Plans

Avant de présenter les autres points forts de Flask, parlons des plans. Un plan est un objet très similaire à un objet d'application Flask, mais au lieu d'en créer un nouveau, il permet l'extension de l'application en cours. Cela peut être utile si vous souhaitez créer plusieurs versions d'une API ou simplement diviser des services au sein d'une même application.

Nous utiliserons ce type de classe pour présenter différents scénarios d'utilisation d'une application Flask. Convertissons le code ci-dessus pour l'insérer dans un plan et le charger dans l'application principale.

Créez un nouveau dossier nommé plans pour commencer à insérer des modules de plan au fur et à mesure que nous progressons dans le billet de blog. À l'intérieur, créez un dossier nommé points de terminaison de base puis un fichier nommé __init__.py:

# blueprints/basic_endpoints/__init__.py
from flask import Blueprint, jsonify

basic_bp = Blueprint('basic_bp', __name__)

@basic_bp.route('/')
def hello():
    return jsonify({'message': 'Hello from a Blueprint!'})

À présent, le main.py le fichier a juste besoin de charger le plan créé et de l'enregistrer dans l'objet de l'application :

# main.py
from flask import Flask
from blueprints.basic_endpoints import basic_bp

app = Flask(__name__)
app.register_blueprint(basic_bp)

if __name__ == '__main__':
    app.run(debug=True)

Vous devriez maintenant avoir exactement les mêmes points de terminaison, mais en utilisant la structure fournie par Blueprints. Cela facilitera la gestion de votre application et sa mise à l'échelle au fur et à mesure de sa croissance.

Digital Transformation Service CTA

Ajouter la validation des demandes et la gestion des erreurs

Lors de la création d'API, il est important de valider les demandes entrantes et de renvoyer des réponses d'erreur significatives en cas de problème. Sans validation, une API peut accepter des données incomplètes ou non valides, ce qui peut entraîner des enregistrements incohérents dans la base de données ou un comportement inattendu de l'application.

Une API bien conçue doit :

  • valider les données des demandes entrantes
  • renvoyer des messages d'erreur clairs
  • utiliser les codes d'état HTTP appropriés

Cela améliore la fiabilité et facilite l'utilisation de l'API pour les autres développeurs.

Valider les données des demandes entrantes

Lorsqu'un client envoie des données à l'API, le serveur doit vérifier que les champs obligatoires sont présents et correctement formatés.

Par exemple, lors de la création d'un nouvel élément, la demande doit inclure à la fois un nom et un prix.

Voici un exemple de validation simple :

@app.route("/items", methods=["POST"])
def create_item():
    data = request.get_json()

    if not data:
        return jsonify({"error": "Request body must be JSON"}), 400

    if "name" not in data or "price" not in data:
        return jsonify({"error": "Both 'name' and 'price' fields are required"}), 400

    item = Item(name=data["name"], price=data["price"])

    db.session.add(item)
    db.session.commit()

    return jsonify(item.to_dict()), 201

Dans cet exemple, l'API vérifie si :

  • le corps de la requête contient du JSON
  • les champs obligatoires sont présents

Si la validation échoue, l'API renvoie un 400 requêtes erronées réponse.

Utilisez des codes d'état HTTP significatifs

Les codes d'état HTTP aident les clients à savoir si une demande a réussi ou échoué.

Parmi les codes courants utilisés dans les API REST, citons :

Status Code Meaning
200 OK The request was successful
201 Created A resource was successfully created
400 Bad Request The request is invalid
404 Not Found The requested resource does not exist
500 Internal Server Error Something unexpected went wrong

L'utilisation du code d'état correct permet aux utilisateurs de l'API de gérer correctement les réponses.

Gérer les ressources manquantes

Lorsqu'un client demande une ressource qui n'existe pas, l'API doit renvoyer un Erreur 404.

Flask-SQLAlchemy fournit une aide pratique pour cela :

item = Item.query.get_or_404(item_id)

Si l'élément n'existe pas, Flask renvoie automatiquement une réponse telle que :

{
  "message": "404 Not Found: The requested URL was not found on the server."
}

Cela empêche l'API de renvoyer des réponses vides ou trompeuses.

Ajouter un gestionnaire d'erreurs global

Dans les applications plus importantes, il est utile de définir des gestionnaires d'erreurs globaux qui renvoient des réponses cohérentes pour les erreurs courantes.

Par exemple :

@app.errorhandler(400)
def bad_request(error):
    return jsonify({
        "error": "Bad Request",
        "message": "The server could not process the request."
    }), 400


@app.errorhandler(404)
def not_found(error):
    return jsonify({
        "error": "Not Found",
        "message": "The requested resource was not found."
    }), 404

Avec ces gestionnaires, l'API renvoie toujours des réponses JSON structurées au lieu des pages d'erreur HTML par défaut.

Exemple de réponse à une erreur

Si un client essaie de créer un élément sans fournir les champs obligatoires, l'API peut renvoyer :

{
  "error": "Bad Request",
  "message": "Both 'name' and 'price' fields are required"
}

La fourniture de messages d'erreur clairs aide les développeurs à comprendre rapidement ce qui s'est mal passé et à résoudre leur demande.

Pourquoi la validation et la gestion des erreurs sont importantes

La validation des demandes et la gestion appropriée des erreurs sont essentielles pour créer des API fiables. Ils veillent à ce que :

  • les données non valides n'entrent pas dans la base de données
  • Les réponses de l'API sont prévisibles
  • les développeurs qui intègrent l'API peuvent diagnostiquer les problèmes rapidement

Ces pratiques sont considérées comme standard dans le développement d'API modernes et doivent être incluses dans tout service backend prêt à être utilisé en production.

blue arrow to the left
Imaginary Cloud logo

Comment générer de la documentation OpenAPI pour une API Flask

Les API modernes devraient exposer une documentation lisible par machine afin que les développeurs puissent facilement comprendre les points de terminaison, les formats de demande et les réponses. La norme la plus largement adoptée à cet effet est API ouverte, qui décrit les API HTTP dans un format structuré que les outils peuvent interpréter automatiquement.

Dans les applications Flask, un moyen pratique de générer de la documentation OpenAPI consiste à utiliser flask-smorest, une bibliothèque qui intègre Flask à OpenAPI 3, la validation des demandes et la documentation automatique de l'interface utilisateur Swagger.

Installez flask-smorest et marshmallow

Tout d'abord, installez les packages requis.

Exécutez la commande suivante :

pip install flask-smorest marshmallow

Si vous préférez gérer les dépendances à l'aide d'un requirements.txt fichier, vous pouvez ajouter les éléments suivants :

Flask
flask-smorest
marshmallow


Dans cette configuration :

  • flask-smorest génère la documentation OpenAPI et gère le routage des API.
  • guimauve gère la validation des demandes et la sérialisation des réponses.

Ensemble, ces bibliothèques permettent aux API Flask de produire automatiquement une documentation interactive et d'appliquer la validation des données.

Configuration de la documentation de Flask pour OpenAPI

Avant de créer des points de terminaison, l'application Flask doit être configurée pour générer de la documentation OpenAPI.

Ajoutez la configuration suivante à votre application Flask :

from flask import Flask
from flask_smorest import Api

app = Flask(__name__)

app.config["API_TITLE"] = "Flask API Demo"
app.config["API_VERSION"] = "v1"
app.config["OPENAPI_VERSION"] = "3.0.3"
app.config["OPENAPI_URL_PREFIX"] = "/"
app.config["OPENAPI_SWAGGER_UI_PATH"] = "/docs"
app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"

api = Api(app)

Cette configuration définit les métadonnées utilisées pour générer la documentation de l'API.

Les principaux paramètres sont les suivants :

  • TITRE DE L'API — le nom de votre API.
  • VERSION DE L'API — la version actuelle de l'API.
  • OPENAPI_VERSION — la version de la spécification OpenAPI utilisée pour décrire l'API.
  • OPENAPI_SWAGGER_UI_PATH — l'URL où la documentation interactive sera disponible.

Une fois l'API exécutée, la documentation sera accessible à l'adresse suivante :

http://localhost:5000/docs

Définir les schémas de demande et de réponse

Les API doivent clairement définir la structure des données qu'elles acceptent et renvoient.
Avec flask-smorest, cela se fait en utilisant Schémas de guimauve.

Créez un schéma pour décrire un élément dans l'API :

from marshmallow import Schema, fields

class ItemSchema(Schema):
    name = fields.String(required=True)
    price = fields.Float(required=True)


Les schémas ont plusieurs objectifs importants :

  • validation des données des demandes entrantes
  • documentation du format de données attendu
  • sérialisation des réponses
  • générer une documentation OpenAPI précise

L'utilisation de schémas garantit que les points de terminaison de l'API se comportent de manière cohérente et rejettent les données non valides.

Création de points de terminaison d'API documentés

Ensuite, créez des points de terminaison d'API à l'aide d'un Plan. Les plans vous permettent de regrouper des itinéraires connexes et d'organiser des API plus importantes.

from flask.views import MethodView
from flask_smorest import Blueprint

blp = Blueprint(
    "items",
    "items",
    url_prefix="/items",
    description="Operations on items"
)

items = []


Chaque plan représente un groupe de points de terminaison connexes qui apparaîtront sous forme de section dans la documentation générée.

Implémenter les points de terminaison CRUD avec validation et documentation

Nous pouvons maintenant implémenter des points de terminaison pour créer et récupérer des éléments.

@blp.route("/")
class ItemsResource(MethodView):

    @blp.response(200, ItemSchema(many=True))
    def get(self):
        """Return all items"""
        return items

    @blp.arguments(ItemSchema)
    @blp.response(201, ItemSchema)
    def post(self, new_item):
        """Create a new item"""
        items.append(new_item)
        return new_item


Dans cet exemple :

  • @blp .arguments (ItemSchema) valide le corps de la requête entrante.
  • @blp .réponse () documente la réponse de l'API et sérialise la sortie.
  • Vue de la méthode permet de regrouper plusieurs méthodes HTTP sous la même route.

Ces décorateurs mettent automatiquement à jour la documentation OpenAPI générée.

Enregistrez le plan

Après avoir défini les points de terminaison, enregistrez le plan auprès de l'instance d'API :

api.register_blueprint(blp)

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


L'enregistrement du plan active les points de terminaison et garantit leur apparition dans la documentation de l'API.

Afficher la documentation de l'API interactive

Une fois l'application lancée, ouvrez l'URL suivante dans votre navigateur :

http://localhost:5000/docs

Vous verrez un écran interactif Interface utilisateur Swagger généré à partir de la spécification OpenAPI.

À partir de cette interface, vous pouvez :

  • Afficher tous les points de terminaison de l'API
  • inspecter les paramètres de la demande
  • testez les points de terminaison directement depuis le navigateur
  • explorer les schémas de demande et de réponse

Cela facilite la compréhension de l'API et simplifie considérablement l'intégration avec d'autres systèmes.

Pourquoi la documentation OpenAPI est importante

L'utilisation d'outils de documentation basés sur OpenAPI tels que flask-smorest offre plusieurs avantages :

  • Génération automatique de documentation
  • Validation des demandes intégrée
  • Structure d'API claire pour les développeurs
  • Compatibilité avec les outils de test et de génération de clients

OpenAPI étant largement adopté dans l'industrie, de nombreux outils de développement peuvent générer automatiquement des bibliothèques clientes, effectuer des tests d'API et valider des demandes en utilisant les mêmes spécifications.

Pour ces raisons, la documentation OpenAPI est devenue une pratique courante lors de la création d'API modernes.

Déploiement d'une API Flask

Une fois que votre API Flask est prête, l'étape suivante consiste à la déployer afin qu'elle soit accessible aux utilisateurs ou à d'autres services. Bien que le serveur Flask intégré soit utile pour le développement, les déploiements en production nécessitent Serveur WSGI et serveur Web pour gérer le trafic de manière fiable.

Une configuration de déploiement courante inclut :

  • Gunicorne ou WSGI en tant que serveur WSGI
  • Nginx en tant que proxy inverse
  • un serveur cloud ou une plateforme de conteneurs telle que AWS, Azure ou Google Cloud

Par exemple, vous pouvez exécuter une application Flask en production à l'aide de Gunicorn :

gunicorn -w 4 app:app

Dans cette commande :

  • -w 4 lance quatre processus de travail
  • application : application fait référence à l'objet d'application Flask

Dans les environnements modernes, les API Flask sont souvent déployées à l'aide de Conteneurs Docker, qui simplifie la mise à l'échelle, la gestion de l'environnement et le déploiement continu.

Sécurisation d'une API Flask avec authentification

La plupart des API de production nécessitent une authentification pour garantir que seuls les utilisateurs ou services autorisés peuvent accéder aux terminaux protégés.

Les approches d'authentification courantes incluent :

  • Clés d'API pour un accès simple de service à service
  • JWT (jetons Web JSON) pour l'authentification des utilisateurs
  • OAuth 2.0 pour les intégrations tierces

Une approche courante dans les API Flask consiste à utiliser l'authentification basée sur JW. Dans ce modèle :

  1. Un utilisateur se connecte à l'aide de ses informations d'identification.
  2. Le serveur génère un jeton signé.
  3. Le client envoie le jeton dans Autorisation en-tête pour chaque demande.

Exemple d'en-tête :

Autorisation : Titulaire <access_token>

Extensions pour flacons telles que Flask-JWT-Extended simplifiez la mise en œuvre de l'authentification basée sur des jetons et protégez les routes d'API.

L'ajout de l'authentification garantit que :

  • seuls les clients autorisés peuvent accéder à l'API
  • les données sensibles sont protégées
  • L'utilisation de l'API peut être surveillée et contrôlée.

blue arrow to the left
Imaginary Cloud logo

Flask vs FastAPI : quel framework devez-vous utiliser ?

Flask est l'un des frameworks Web Python les plus utilisés pour créer des API, mais ce n'est pas la seule option. Ces dernières années, API rapide a gagné en popularité en tant que framework moderne conçu spécifiquement pour créer des API hautes performances.

Les deux frameworks sont puissants, mais leur philosophie et leurs fonctionnalités diffèrent.

Side-by-Side Feature Matrix

A granular look at the technical differences between Flask and FastAPI, highlighting tooling, architecture, and developer experience.

Feature Category Flask FastAPI
Release History Established (2010) Modern (2018)
Asynchronous Capabilities Limited Support Native ASGI
Data Integrity Requires Marshmallow Built-in (Pydantic)
Self-Documenting Requires Extensions Automatic OpenAPI
Complexity to Learn Low Moderate (Type Hints)

Quand utiliser Flask

Flask est souvent le meilleur choix lorsque vous avez besoin d'un framework flexible capable de s'adapter à différents types d'applications.

Le flacon convient bien pour :

  • API de petite et moyenne taille
  • microservices
  • services de backend pour les applications Web
  • projets nécessitant un contrôle total de l'architecture
  • équipes déjà familiarisées avec Flask ou l'écosystème Python

Comme Flask est léger et sans opinion, les développeurs peuvent facilement personnaliser la structure de l'application.

Quand utiliser FastAPI

FastAPI est spécialement conçu pour créer des API et comprend de nombreuses fonctionnalités prêtes à l'emploi.

FastAPI est un excellent choix pour :

  • API hautes performances
  • applications asynchrones
  • Des API qui s'appuient largement sur les indices de type Python
  • projets nécessitant une validation et une documentation automatiques

FastAPI génère automatiquement une documentation API interactive et effectue la validation des demandes à l'aide de Modèles Pydantic, ce qui réduit la quantité de code standard que les développeurs doivent écrire.

Quel cadre est le meilleur ?

Il n'existe pas de réponse universelle à cette question. Les deux frameworks sont largement utilisés et capables d'alimenter les applications de production.

  • Flacon offre une flexibilité maximale et un écosystème mature.
  • API rapide propose des fonctionnalités modernes et des optimisations de performances intégrées.

Pour de nombreuses équipes, le choix dépend de l'expérience existante, des exigences du projet et du style de développement préféré.

Framework Selection Engine

Align your project goals with the right technology stack using the interactive tool below.

Your Project Profile

?

Define Your Needs

Select at least one requirement to calculate the strategic fit for your team.

Flask Ecosystem Fit 0%
FastAPI Modern Fit 0%

Principaux points à retenir

  • Flask est un framework Python léger parfaitement adapté à la création d'API REST et de microservices.
  • Une API Flask prête pour la production inclut généralement la persistance de la base de données, la validation des demandes et la gestion structurée des erreurs.
  • SQLAlchemy simplifie les interactions avec les bases de données et prend en charge plusieurs bases de données relationnelles.
  • Des outils tels que flask-smorest permettent aux développeurs de générer automatiquement de la documentation OpenAPI.
  • Le choix entre Flask et FastAPI dépend des exigences du projet, des besoins de performance et de l'expérience de l'équipe.
blue arrow to the left
Imaginary Cloud logo

Points clés à retenir : créer des API avec Flask

Flask reste un choix puissant et flexible pour créer des API Python. Sa conception légère, son architecture modulaire et son écosystème étendu le rendent parfaitement adapté à tout, des services simples aux systèmes dorsaux évolutifs. Dans ce guide, nous avons exploré comment créer une API Flask étape par étape, y compris la configuration du projet, l'intégration de la base de données, la validation des demandes, la gestion des erreurs et la documentation OpenAPI, toutes des pratiques clés qui aident à créer des API maintenables et prêtes pour la production.

Si vous envisagez de créer une nouvelle API ou de moderniser un backend existant, le choix précoce de la bonne architecture peut faire toute la différence. Vous avez besoin d'aide pour créer ou faire évoluer une API Flask ? Contactez Imaginary Cloud pour discuter de votre projet.

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo

Questions fréquemment posées

Qu'est-ce qu'une API Flask ?

Une API Flask fait référence à un service Web RESTful créé à l'aide du framework Flask en Python. Il expose les points de terminaison avec lesquels les clients peuvent interagir via HTTP, renvoyant généralement des données au format JSON.

Est-ce que Flask est une API backend ?

Oui, Flask peut être utilisé comme framework backend pour créer des API qui fournissent des données à des applications frontales ou à des services tiers.

Quelle est la différence entre Flask et REST ?

Flask est un framework Web, tandis que REST est un style architectural pour la conception d'applications en réseau. Vous pouvez utiliser Flask pour implémenter des API REST.

Python Flask est-il bon pour l'API ?

Oui, Flask est un excellent choix pour créer des API en raison de sa simplicité, de sa flexibilité et de sa large gamme d'extensions prenant en charge la documentation, l'authentification et le déploiement.

Quels sont les cas d'utilisation courants de Flask ?

Flask est couramment utilisé pour créer des API REST, des microservices, des tableaux de bord d'administration, des applications de prototypage et l'intégration à des modèles d'apprentissage automatique.

Est-ce que Flask peut être utilisé en production ?

Oui Le flacon peut être utilisé en production et alimente de nombreuses applications Web et API du monde réel. Alors que le serveur de développement Flask intégré est uniquement destiné au développement, les déploiements de production utilisent généralement un Serveur WSGI tel que Gunicorn ou uWSGI derrière un serveur Web tel que Nginx ou Apache.

Avec une configuration appropriée, les applications Flask peuvent évoluer efficacement et prendre en charge les charges de travail de production, en particulier lorsqu'elles sont combinées à des outils tels que Docker, proxys inverses et services de base de données.

Comment déployer une API Flask ?

Une API Flask est généralement déployée à l'aide d'un Serveur WSGI et proxy inverse.

Les étapes de base du déploiement sont les suivantes :

  1. Emballez l'application Flask et installez les dépendances.
  2. Exécutez l'application à l'aide d'un serveur WSGI de production tel que Gunicorne.
  3. Configurez un proxy inverse tel que Nginx pour gérer le trafic entrant.
  4. Déployez l'application sur une plateforme d'hébergement, un serveur cloud ou un environnement de conteneurs.

Par exemple, une commande de déploiement courante utilisant Gunicorn est la suivante :

application gunicorn -w 4 : application

Dans une infrastructure moderne, les API Flask sont souvent déployées à l'aide de Conteneurs Docker et plateformes cloud telles qu'AWS, Azure ou Google Cloud.

Quelle est la différence entre Flask et Django REST ?

La principale différence entre Flask et Django REST Framework (DRF) est le niveau de structure et de fonctionnalité intégrée.

Flacon est un microframework léger et flexible qui permet aux développeurs de choisir leurs propres bibliothèques et architectures. Il fournit des fonctionnalités intégrées minimales et est hautement personnalisable.

Framework Django REST, d'autre part, est un framework complet construit sur Django qui inclut des outils intégrés pour authentification, sérialisation, autorisations et vues d'API.

En général :

  • Flacon convient mieux aux API de petite et moyenne taille, aux microservices et aux architectures hautement personnalisées.
  • Framework Django REST est souvent préférée pour les applications plus importantes qui bénéficient de l'écosystème intégré et des conventions de Django.

Build scalable products with Web and Mobile Development call to action

Vous avez trouvé cet article utile ? Ceux-ci vous plairont peut-être aussi !

Pedro Martinho
Pedro Martinho

Développeur associé travaillant principalement avec les technologies Backend. Un entrepreneur qui s'intéresse à la science des données. J'adore le sport, les livres audio, le café et les mèmes !

Read more posts by this author
Tiago Franco
Tiago Franco

CEO @ Imaginary Cloud et co-auteur du livre Product Design Process. J'aime la nourriture, le vin et le Krav Maga (pas nécessairement dans cet ordre).

Read more posts by this author
Alexandra Mendes
Alexandra Mendes

Alexandra Mendes est spécialiste senior de la croissance chez Imaginary Cloud et possède plus de 3 ans d'expérience dans la rédaction de textes sur le développement de logiciels, l'IA et la transformation numérique. Après avoir suivi un cours de développement frontend, Alexandra a acquis des compétences pratiques en matière de codage et travaille désormais en étroite collaboration avec les équipes techniques. Passionnée par la façon dont les nouvelles technologies façonnent les entreprises et la société, Alexandra aime transformer des sujets complexes en contenus clairs et utiles pour les décideurs.

LinkedIn

Read more posts by this author

People who read this post, also found these interesting:

arrow left
arrow to the right
Dropdown caret icon