2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Table des matières
02Utilisation de base d'Apispec
Générer une documentation API simple
2. Définir les routes et les vues API
3. Ajouter un chemin vers Apispec
1. Installez Flask et Flask-Apispec
2. Créez une application Flask
1. Installez Django et Django-Rest-Framework
2. Créer des projets et des applications Django
3. Configurer le projet Django
6. Générer la spécification OpenAPI
03Les fonctionnalités avancées de Apispec
2. Prise en charge de plusieurs frameworks
3. Générez automatiquement les documents d'interface
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.
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.
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.
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
Examinons l'utilisation de base d'Apispec à travers quelques exemples simples.
- from apispec import APISpec
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- info=dict(description="This is a sample API"),
- )
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return {"id": user_id, "name": "John Doe"}
- spec.path(
- path="/users/{user_id}",
- operations=dict(
- get=dict(
- description="Get a user by ID",
- parameters=[
- {
- "name": "user_id",
- "in": "path",
- "required": True,
- "schema": {"type": "integer"},
- }
- ],
- responses={
- "200": {
- "description": "A user object",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": {"type": "integer"},
- "name": {"type": "string"},
- },
- }
- }
- },
- }
- },
- )
- ),
- )
pip install Flask Flask-Apispec
- from flask import Flask, jsonify
- from flask_apispec import FlaskApiSpec, doc, marshal_with
- from flask_apispec.views import MethodResource
- from marshmallow import Schema, fields
-
- app = Flask(__name__)
-
- class UserSchema(Schema):
- id = fields.Int()
- name = fields.Str()
-
- class UserResource(MethodResource):
- @doc(description='Get a user by ID', tags=['User'])
- @marshal_with(UserSchema)
- def get(self, user_id):
- return {"id": user_id, "name": "John Doe"}
-
- app.add_url_rule('/users/<int:user_id>', view_func=UserResource.as_view('user_resource'))
- docs = FlaskApiSpec(app)
- docs.register(UserResource)
-
- @app.route('/swagger/')
- def swagger_ui():
- return jsonify(docs.spec.to_dict())
-
- if __name__ == '__main__':
- app.run()
pip install django djangorestframework
- django-admin startproject myproject
- cd myproject
- django-admin startapp myapp
Ajoutez rest_framework et apispec dans settings.py :
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
Dans monapp/views.py :
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.schemas import AutoSchema
-
- class UserView(APIView):
- schema = AutoSchema(
- manual_fields=[
- coreapi.Field('user_id', required=True, location='path', schema={'type': 'integer'})
- ]
- )
-
- def get(self, request, user_id):
- """
- Get a user by ID.
- ---
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return Response({"id": user_id, "name": "John Doe"})
Dans monapp/urls.py :
- from django.urls import path
- from .views import UserView
-
- urlpatterns = [
- path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
- ]
Dans gérer.py :
- from apispec import APISpec
- from rest_framework.schemas import get_schema_view
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- )
-
- schema_view = get_schema_view(title="My API")
- schema = schema_view.get_schema(request=None, public=True)
- spec.components.schema('User', schema)
- spec.path(path='/users/{user_id}/', operations=schema['paths']['/users/{user_id}/'])
-
- print(spec.to_yaml())
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.
- from apispec import BasePlugin
-
- class MyPlugin(BasePlugin):
- def path_helper(self, operations, *, resource, **kwargs):
- operations.update({
- 'get': {
- 'description': 'Get a user by ID',
- 'parameters': [
- {'name': 'user_id', 'in': 'path', 'required': True, 'schema': {'type': 'integer'}}
- ],
- 'responses': {
- '200': {
- 'description': 'A user object',
- 'content': {
- 'application/json': {
- 'schema': {
- 'type': 'object',
- 'properties': {
- 'id': {'type': 'integer'},
- 'name': {'type': 'string'}
- }
- }
- }
- }
- }
- }
- }
- })
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- plugins=[MyPlugin()],
- )
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.
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.
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return {"id": user_id, "name": "John Doe"}
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.
- from flask import Flask, jsonify
- from flask_apispec import FlaskApiSpec
-
- app = Flask(__name__)
-
- @app.route('/users/<int:user_id>', methods=['GET'])
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return jsonify({"id": user_id, "name": "John Doe"})
-
- docs = FlaskApiSpec(app)
- docs.register(get_user)
-
- if __name__ == '__main__':
- app.run()
Construire un système de documentation API complet
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é.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Ajoutez des dépendances dans Requirements.txt :
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Exécutez la commande suivante pour installer les dépendances :
pip install -r requirements.txt
Définissez le modèle utilisateur dans models.py :
- from flask_sqlalchemy import SQLAlchemy
-
- db = SQLAlchemy()
-
- class User(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(80), nullable=False)
- email = db.Column(db.String(120), unique=True, nullable=False)
Définissez les sérialiseurs utilisateur dans serializers.py :
- from marshmallow import Schema, fields
-
- class UserSchema(Schema):
- id = fields.Int(dump_only=True)
- name = fields.Str(required=True)
- email = fields.Email(required=True)
-
Définir des vues dans vues.py :
- from flask import request
- from flask_restful import Resource
- from models import User, db
- from serializers import UserSchema
-
- class UserResource(Resource):
- def get(self, user_id):
- user = User.query.get_or_404(user_id)
- schema = UserSchema()
- return schema.dump(user)
-
- def post(self):
- schema = UserSchema()
- user = schema.load(request.json)
- db.session.add(user)
- db.session.commit()
- return schema.dump(user), 201
-
- def put(self, user_id):
- user = User.query.get_or_404(user_id)
- schema = UserSchema(partial=True)
- updated_user = schema.load(request.json, instance=user)
- db.session.commit()
- return schema.dump(updated_user)
-
- def delete(self, user_id):
- user = User.query.get_or_404(user_id)
- db.session.delete(user)
- db.session.commit()
- return '', 204
Dans app.py :
- from flask import Flask
- from flask_restful import Api
- from flask_migrate import Migrate
- from models import db
- from views import UserResource
- from flask_apispec import FlaskApiSpec
- from flask_apispec.extension import FlaskApiSpec
-
- app = Flask(__name__)
- app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
- db.init_app(app)
- migrate = Migrate(app, db)
- api = Api(app)
-
- api.add_resource(UserResource, '/users/<int:user_id>')
-
- docs = FlaskApiSpec(app)
- docs.register(UserResource)
-
- if __name__ == '__main__':
- app.run()
Démarrez l'application en exécutant la commande suivante :
python app.py
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é.
- spec.components.parameter("user_id", "path", schema={"type": "integer"}, required=True)
- spec.components.response("User", {
- "description": "A user object",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": {"type": "integer"},
- "name": {"type": "string"}
- }
- }
- }
- }
- })
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
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.