Compartir tecnología

Apispec, una biblioteca de Python para generar especificaciones OpenAPI (Swagger)

2024-07-12

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

Tabla de contenido

01¿Qué es APIspec?

¿Por qué elegir Apispec?

Instalacion y configuracion

02Uso básico de Apispec

Genere documentación API sencilla

1. Cree una instancia de Apispec

2. Definir rutas y vistas API

3. Agregar ruta a Apispec

Integrar Flask y APIspec

1. Instale Flask y Flask-Apispec

2. Crea una aplicación Flask

Integra Django y APIspec

1. Instale Django y Django-Rest-Framework

2. Crea proyectos y aplicaciones de Django.

3. Configurar el proyecto Django

4. Definir vistas de Django

5. Configurar URL

6. Generar especificación OpenAPI

03Funciones avanzadas de Apispec

1. Generador personalizado

2. Admite múltiples marcos

3. Generar automáticamente documentos de interfaz.

4. Integrar con herramientas de terceros

04Casos prácticos

1. Introducción al proyecto

2. Estructura del proyecto

3. Instalar dependencias

4. Definir el modelo

5. Definir vistas y serialización.

6. Definir la aplicación principal.

7. Ejecute la aplicación y vea la documentación.

Visite http://localhost:5000/swagger/ para ver la documentación de API generada.

05Mejores Prácticas

06 Resumen



01¿Qué es APIspec?

Introducción a las especificaciones API

Apispec es una biblioteca de Python para generar especificaciones OpenAPI (Swagger). Puede ayudar a los desarrolladores a generar y mantener automáticamente documentos API y proporcionar descripciones de interfaz intuitivas y detalladas. A través de Apispec, podemos convertir fácilmente la cadena de documentación de una función o clase de Python en un documento que cumpla con la especificación OpenAPI, lo que reduce la molestia de escribir documentación manualmente.

¿Por qué elegir Apispec?

  • Simple y fácil de usar: Apispec proporciona una API simple y fácil de usar para que pueda comenzar rápidamente.

  • Flexible y potente: Admite múltiples marcos (como Flask, Django) y extensiones, lo que le permite personalizar la generación de documentos según sea necesario.

  • automatización: Reduzca las operaciones manuales y los costos de mantenimiento generando y actualizando documentos automáticamente.

Instalacion y configuracion

Antes de comenzar a usar Apispec, primero debemos instalarlo. Puedes instalarlo usando pip:

pip install apispec

Dirección del proyecto Github:

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

02Uso básico de APIspec

Veamos el uso básico de Apispec a través de algunos ejemplos simples.

Genere documentación API sencilla

1. Cree una instancia de 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. Definir rutas y vistas 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. Agregar ruta a 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. )

Integrar Flask y APIspec

1. Instale Flask y Flask-Apispec

pip install Flask Flask-Apispec

2. Crea una aplicación 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()

Integra Django y APIspec

1. Instale Django y Django-Rest-Framework

pip install django djangorestframework

2. Crea proyectos y aplicaciones de Django.

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

3. Configurar el proyecto Django

Agregue rest_framework y apispec en settings.py:

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

4. Definir vistas de Django

En miaplicación/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. Configurar URL

En miaplicación/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. Generar especificación OpenAPI

En administrar.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())

03Funciones avanzadas de APIspec

1. Generador personalizado

APIspec proporciona un mecanismo de extensión flexible que le permite personalizar los generadores. Puede implementar su propia lógica de generación heredando y extendiendo la clase base proporcionada por 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. Admite múltiples marcos

Apispec admite una variedad de marcos Python populares, como Flask, Django, Falcon, etc. Puede elegir los marcos y complementos adecuados según sus necesidades y generar rápidamente documentos API.

3. Generar automáticamente documentos de interfaz.

Apispec puede generar automáticamente documentos de interfaz basados ​​en la cadena de documentación de una función o clase, lo que reduce la carga de trabajo de escribir documentos manualmente.

  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. Integrar con herramientas de terceros

Apispec se puede integrar con muchas herramientas de terceros, como Swagger UI, ReDoc, etc., para proporcionar funciones de prueba y visualización de documentos de interfaz intuitiva.

  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()

04Casos prácticos

Cree un sistema completo de documentación API

1. Introducción al proyecto

Supongamos que tenemos un sistema de gestión de usuarios simple y necesitamos documentar su API. Nuestra API incluye operaciones de adición, eliminación, modificación y consulta de usuarios, así como algunas funciones básicas de autenticación de identidad.

2. Estructura del proyecto

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

3. Instalar dependencias

Agregue dependencias en requisitos.txt:

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

Ejecute el siguiente comando para instalar dependencias:

pip install -r requirements.txt

4. Definir el modelo

Defina el modelo de usuario en 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. Definir vistas y serialización.

Defina serializadores de usuario en 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)

Definir vistas en views.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. Definir la aplicación principal.

En aplicación.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. Ejecute la aplicación y vea la documentación.

Inicie la aplicación ejecutando el siguiente comando:

python app.py

Visite http://localhost:5000/swagger/ para ver la documentación de API generada.

05Mejores prácticas

1. Mantenga la documentación y el código sincronizados

Asegúrese de que la documentación esté siempre sincronizada con el código para evitar inconsistencias entre la documentación y la API real. Puede utilizar herramientas de CI/CD para generar e implementar documentación automáticamente.

2. Utilice anotaciones y decoradores.

Al utilizar comentarios y decoradores, la documentación puede volverse más concisa y legible. Por ejemplo, utilice el decorador @doc de Flask-Apispec para agregar información de documentación a una función de vista.

3. Definir parámetros y respuestas globales.

Para los parámetros y respuestas de uso común, se pueden definir parámetros globales y plantillas de respuesta en Apispec para reducir el código repetido.

  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. Revisar y actualizar periódicamente la documentación.

Revise y actualice periódicamente la documentación para garantizar su precisión e integridad. Esto se puede lograr estableciendo un ciclo de revisión de documentos o introduciendo un proceso de revisión de documentos.

Para obtener más funciones y uso detallado, consulte la documentación oficial:

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

06resumen

A través de este artículo, creo que tiene una comprensión básica y un dominio de Apispec. Desde el uso básico hasta funciones avanzadas, pasando por casos prácticos y mejores prácticas, presentamos de manera integral cómo usar Apispec para generar y mantener documentos API.

Espero que puedas aplicar este conocimiento a proyectos reales y agregar un toque de brillo a tu API.