Partage de technologie

Apispec, une bibliothèque Python pour générer des spécifications OpenAPI (Swagger)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Table des matières

01Qu'est-ce qu'APIspec ?

Pourquoi choisir Apispec ?

Installation et configuration

02Utilisation de base d'Apispec

Générer une documentation API simple

1. Créez une instance Apispec

2. Définir les routes et les vues API

3. Ajouter un chemin vers Apispec

Intégrer Flask et APIspec

1. Installez Flask et Flask-Apispec

2. Créez une application Flask

Intégrer Django et APIspec

1. Installez Django et Django-Rest-Framework

2. Créer des projets et des applications Django

3. Configurer le projet Django

4. Définir les vues Django

5. Configurer l'URL

6. Générer la spécification OpenAPI

03Les fonctionnalités avancées de Apispec

1. Générateur personnalisé

2. Prise en charge de plusieurs frameworks

3. Générez automatiquement les documents d'interface

4. Intégrez des outils tiers

04Cas pratiques

1. Présentation du projet

2. Structure du projet

3. Installer les dépendances

4. Définir le modèle

5. Définir les vues et la sérialisation

6. Définir l'application principale

7. Exécutez l'application et consultez la documentation

Visitez http://localhost:5000/swagger/ pour afficher la documentation de l'API générée.

05Bonnes pratiques

06 Résumé



01Qu'est-ce qu'APIspec ?

Introduction aux APIspecs

Apispec est une bibliothèque Python permettant de générer des spécifications OpenAPI (Swagger). Il peut aider les développeurs à générer et à maintenir automatiquement des documents API et à fournir des descriptions d'interface intuitives et détaillées. Grâce à Apispec, nous pouvons facilement convertir la chaîne de documentation d'une fonction ou d'une classe Python en un document conforme à la spécification OpenAPI, réduisant ainsi les problèmes d'écriture manuelle de la documentation.

Pourquoi choisir Apispec ?

  • Simple et facile à utiliser: Apispec fournit une API simple et facile à utiliser pour que vous puissiez démarrer rapidement.

  • Souple et puissant: Prend en charge plusieurs frameworks (tels que Flask, Django) et extensions, vous permettant de personnaliser la génération de documents selon vos besoins.

  • automatisation: Réduisez les coûts d’opérations manuelles et de maintenance en générant et en mettant à jour automatiquement les documents.

Installation et configuration

Avant de commencer à utiliser Apispec, nous devons d'abord l'installer. Vous pouvez l'installer en utilisant pip :

pip install apispec

Adresse du projet Github :

https://github.com/marshmallow-code/apispec

02Utilisation de base d'APIspec

Examinons l'utilisation de base d'Apispec à travers quelques exemples simples.

Générer une documentation API simple

1. Créez une instance Apispec

  1. from apispec import APISpec
  2. spec = APISpec(
  3.     title="My API",
  4.     version="1.0.0",
  5.     openapi_version="3.0.0",
  6.     info=dict(description="This is a sample API"),
  7. )

2. Définir les routes et les vues API

  1. def get_user(user_id):
  2.     """
  3.     ---
  4.     get:
  5.       description: Get a user by ID
  6.       parameters:
  7.         - name: user_id
  8.           in: path
  9.           required: true
  10.           schema:
  11.             type: integer
  12.       responses:
  13.         200:
  14.           description: A user object
  15.           content:
  16.             application/json:
  17.               schema:
  18.                 type: object
  19.                 properties:
  20.                   id:
  21.                     type: integer
  22.                   name:
  23.                     type: string
  24.     """
  25.     return {"id": user_id, "name""John Doe"}

3. Ajouter un chemin vers Apispec

  1. spec.path(
  2.     path="/users/{user_id}",
  3.     operations=dict(
  4.         get=dict(
  5.             description="Get a user by ID",
  6.             parameters=[
  7.                 {
  8.                     "name""user_id",
  9.                     "in""path",
  10.                     "required"True,
  11.                     "schema": {"type""integer"},
  12.                 }
  13.             ],
  14.             responses={
  15.                 "200": {
  16.                     "description""A user object",
  17.                     "content": {
  18.                         "application/json": {
  19.                             "schema": {
  20.                                 "type""object",
  21.                                 "properties": {
  22.                                     "id": {"type""integer"},
  23.                                     "name": {"type""string"},
  24.                                 },
  25.                             }
  26.                         }
  27.                     },
  28.                 }
  29.             },
  30.         )
  31.     ),
  32. )

Intégrer Flask et APIspec

1. Installez Flask et Flask-Apispec

pip install Flask Flask-Apispec

2. Créez une application Flask

  1. from flask import Flask, jsonify
  2. from flask_apispec import FlaskApiSpec, doc, marshal_with
  3. from flask_apispec.views import MethodResource
  4. from marshmallow import Schema, fields
  5. app = Flask(__name__)
  6. class UserSchema(Schema):
  7.     id = fields.Int()
  8.     name = fields.Str()
  9. class UserResource(MethodResource):
  10.     @doc(description='Get a user by ID', tags=['User'])
  11.     @marshal_with(UserSchema)
  12.     def get(self, user_id):
  13.         return {"id": user_id, "name""John Doe"}
  14. app.add_url_rule('/users/<int:user_id>', view_func=UserResource.as_view('user_resource'))
  15. docs = FlaskApiSpec(app)
  16. docs.register(UserResource)
  17. @app.route('/swagger/')
  18. def swagger_ui():
  19.     return jsonify(docs.spec.to_dict())
  20. if __name__ == '__main__':
  21.     app.run()

Intégrer Django et APIspec

1. Installez Django et Django-Rest-Framework

pip install django djangorestframework

2. Créer des projets et des applications Django

  1. django-admin startproject myproject
  2. cd myproject
  3. django-admin startapp myapp

3. Configurer le projet Django

Ajoutez rest_framework et apispec dans settings.py :

  1. INSTALLED_APPS = [
  2.     ...
  3.     'rest_framework',
  4.     'myapp',
  5.     'apispec',
  6. ]

4. Définir les vues Django

Dans monapp/views.py :

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.schemas import AutoSchema
  4. class UserView(APIView):
  5.     schema = AutoSchema(
  6.         manual_fields=[
  7.             coreapi.Field('user_id', required=True, location='path', schema={'type''integer'})
  8.         ]
  9.     )
  10.     def get(self, request, user_id):
  11.         """
  12.         Get a user by ID.
  13.         ---
  14.         responses:
  15.           200:
  16.             description: A user object
  17.             content:
  18.               application/json:
  19.                 schema:
  20.                   type: object
  21.                   properties:
  22.                     id:
  23.                       type: integer
  24.                     name:
  25.                       type: string
  26.         """
  27.         return Response({"id": user_id, "name""John Doe"})

5. Configurer l'URL

Dans monapp/urls.py :

  1. from django.urls import path
  2. from .views import UserView
  3. urlpatterns = [
  4.     path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
  5. ]

6. Générer la spécification OpenAPI

Dans gérer.py :

  1. from apispec import APISpec
  2. from rest_framework.schemas import get_schema_view
  3. spec = APISpec(
  4.     title="My API",
  5.     version="1.0.0",
  6.     openapi_version="3.0.0",
  7. )
  8. schema_view = get_schema_view(title="My API")
  9. schema = schema_view.get_schema(request=None, public=True)
  10. spec.components.schema('User', schema)
  11. spec.path(path='/users/{user_id}/', operations=schema['paths']['/users/{user_id}/'])
  12. print(spec.to_yaml())

03Fonctionnalités avancées d'APIspec

1. Générateur personnalisé

APIspec fournit un mécanisme d'extension flexible qui vous permet de personnaliser les générateurs. Vous pouvez implémenter votre propre logique de génération en héritant et en étendant la classe de base fournie par Apispec.

  1. from apispec import BasePlugin
  2. class MyPlugin(BasePlugin):
  3.     def path_helper(self, operations, *, resource, **kwargs):
  4.         operations.update({
  5.             'get': {
  6.                 'description''Get a user by ID',
  7.                 'parameters': [
  8.                     {'name''user_id''in''path''required'True'schema': {'type''integer'}}
  9.                 ],
  10.                 'responses': {
  11.                     '200': {
  12.                         'description''A user object',
  13.                         'content': {
  14.                             'application/json': {
  15.                                 'schema': {
  16.                                     'type''object',
  17.                                     'properties': {
  18.                                         'id': {'type''integer'},
  19.                                         'name': {'type''string'}
  20.                                     }
  21.                                 }
  22.                             }
  23.                         }
  24.                     }
  25.                 }
  26.             }
  27.         })
  28. spec = APISpec(
  29.     title="My API",
  30.     version="1.0.0",
  31.     openapi_version="3.0.0",
  32.     plugins=[MyPlugin()],
  33. )

2. Prise en charge de plusieurs frameworks

Apispec prend en charge une variété de frameworks Python populaires, tels que Flask, Django, Falcon, etc. Vous pouvez choisir les frameworks et plug-ins appropriés en fonction de vos besoins pour générer rapidement des documents API.

3. Générez automatiquement les documents d'interface

Apispec peut générer automatiquement des documents d'interface basés sur la chaîne de documentation d'une fonction ou d'une classe, réduisant ainsi la charge de travail liée à l'écriture manuelle de documents.

  1. def get_user(user_id):
  2.     """
  3.     ---
  4.     get:
  5.       description: Get a user by ID
  6.       parameters:
  7.         - name: user_id
  8.           in: path
  9.           required: true
  10.           schema:
  11.             type: integer
  12.       responses:
  13.         200:
  14.           description: A user object
  15.           content:
  16.             application/json:
  17.               schema:
  18.                 type: object
  19.                 properties:
  20.                   id:
  21.                     type: integer
  22.                   name:
  23.                     type: string
  24.     """
  25.     return {"id": user_id, "name""John Doe"}

4. Intégrez des outils tiers

Apispec peut être intégré à de nombreux outils tiers, tels que Swagger UI, ReDoc, etc., pour fournir des fonctions intuitives d'affichage et de test des documents d'interface.

  1. from flask import Flask, jsonify
  2. from flask_apispec import FlaskApiSpec
  3. app = Flask(__name__)
  4. @app.route('/users/<int:user_id>', methods=['GET'])
  5. def get_user(user_id):
  6.     """
  7.     ---
  8.     get:
  9.       description: Get a user by ID
  10.       parameters:
  11.         - name: user_id
  12.           in: path
  13.           required: true
  14.           schema:
  15.             type: integer
  16.       responses:
  17.         200:
  18.           description: A user object
  19.           content:
  20.             application/json:
  21.               schema:
  22.                 type: object
  23.                 properties:
  24.                   id:
  25.                     type: integer
  26.                   name:
  27.                     type: string
  28.     """
  29.     return jsonify({"id": user_id, "name""John Doe"})
  30. docs = FlaskApiSpec(app)
  31. docs.register(get_user)
  32. if __name__ == '__main__':
  33.     app.run()

04Cas pratiques

Construire un système de documentation API complet

1. Présentation du projet

Supposons que nous ayons un système de gestion des utilisateurs simple et que nous devions documenter son API. Notre API comprend des opérations d'ajout, de suppression, de modification et de requête d'utilisateurs, ainsi que certaines fonctions de base d'authentification d'identité.

2. Structure du projet

  1. user_management/
  2. ├── app.py
  3. ├── models.py
  4. ├── views.py
  5. ├── serializers.py
  6. └── requirements.txt

3. Installer les dépendances

Ajoutez des dépendances dans Requirements.txt :

  1. Flask
  2. Flask-RESTful
  3. Flask-SQLAlchemy
  4. Flask-Migrate
  5. apispec
  6. flask-apispec

Exécutez la commande suivante pour installer les dépendances :

pip install -r requirements.txt

4. Définir le modèle

Définissez le modèle utilisateur dans models.py :

  1. from flask_sqlalchemy import SQLAlchemy
  2. db = SQLAlchemy()
  3. class User(db.Model):
  4.     id = db.Column(db.Integer, primary_key=True)
  5.     name = db.Column(db.String(80), nullable=False)
  6.     email = db.Column(db.String(120), unique=True, nullable=False)

5. Définir les vues et la sérialisation

Définissez les sérialiseurs utilisateur dans serializers.py :

  1. from marshmallow import Schema, fields
  2. class UserSchema(Schema):
  3.     id = fields.Int(dump_only=True)
  4.     name = fields.Str(required=True)
  5.     email = fields.Email(required=True)

Définir des vues dans vues.py :

  1. from flask import request
  2. from flask_restful import Resource
  3. from models import User, db
  4. from serializers import UserSchema
  5. class UserResource(Resource):
  6.     def get(self, user_id):
  7.         user = User.query.get_or_404(user_id)
  8.         schema = UserSchema()
  9.         return schema.dump(user)
  10.     def post(self):
  11.         schema = UserSchema()
  12.         user = schema.load(request.json)
  13.         db.session.add(user)
  14.         db.session.commit()
  15.         return schema.dump(user), 201
  16.     def put(self, user_id):
  17.         user = User.query.get_or_404(user_id)
  18.         schema = UserSchema(partial=True)
  19.         updated_user = schema.load(request.json, instance=user)
  20.         db.session.commit()
  21.         return schema.dump(updated_user)
  22.     def delete(self, user_id):
  23.         user = User.query.get_or_404(user_id)
  24.         db.session.delete(user)
  25.         db.session.commit()
  26.         return ''204

6. Définir l'application principale

Dans app.py :

  1. from flask import Flask
  2. from flask_restful import Api
  3. from flask_migrate import Migrate
  4. from models import db
  5. from views import UserResource
  6. from flask_apispec import FlaskApiSpec
  7. from flask_apispec.extension import FlaskApiSpec
  8. app = Flask(__name__)
  9. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
  10. db.init_app(app)
  11. migrate = Migrate(app, db)
  12. api = Api(app)
  13. api.add_resource(UserResource, '/users/<int:user_id>')
  14. docs = FlaskApiSpec(app)
  15. docs.register(UserResource)
  16. if __name__ == '__main__':
  17.     app.run()

7. Exécutez l'application et consultez la documentation

Démarrez l'application en exécutant la commande suivante :

python app.py

Visitez http://localhost:5000/swagger/ pour afficher la documentation de l'API générée.

05Les meilleures pratiques

1. Gardez la documentation et le code synchronisés

Assurez-vous que la documentation est toujours synchronisée avec le code pour éviter les incohérences entre la documentation et l'API réelle. Vous pouvez utiliser les outils CI/CD pour générer et déployer automatiquement la documentation.

2. Utilisez des annotations et des décorateurs

En utilisant des annotations et des décorateurs, la documentation peut être rendue plus concise et lisible. Par exemple, utilisez le décorateur @doc de Flask-Apispec pour ajouter des informations de documentation à une fonction d'affichage.

3. Définir les paramètres et les réponses globaux

Pour les paramètres et réponses couramment utilisés, des paramètres globaux et des modèles de réponse peuvent être définis dans Apispec afin de réduire le code répété.

  1. spec.components.parameter("user_id""path", schema={"type""integer"}, required=True)
  2. spec.components.response("User", {
  3.     "description""A user object",
  4.     "content": {
  5.         "application/json": {
  6.             "schema": {
  7.                 "type""object",
  8.                 "properties": {
  9.                     "id": {"type""integer"},
  10.                     "name": {"type""string"}
  11.                 }
  12.             }
  13.         }
  14.     }
  15. })

4. Examiner et mettre à jour régulièrement la documentation

Examiner et mettre à jour régulièrement la documentation pour garantir son exactitude et son exhaustivité. Ceci peut être réalisé en mettant en place un cycle d’examen des documents ou en introduisant un processus d’examen des documents.

Pour plus de fonctions et une utilisation détaillée, veuillez vous référer à la documentation officielle :

https://apispec.readthedocs.io/en/latest

06résumé

Grâce à cet article, je pense que vous avez une compréhension et une maîtrise de base d'Apispec. De l'utilisation de base aux fonctions avancées, en passant par les cas pratiques et les meilleures pratiques, nous présentons en détail comment utiliser Apispec pour générer et maintenir des documents API.

J'espère que vous pourrez appliquer ces connaissances à des projets réels et ajouter une touche de luminosité à votre API.