Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tabla de contenido
Genere documentación API sencilla
1. Cree una instancia de Apispec
1. Instale Flask y Flask-Apispec
1. Instale Django y Django-Rest-Framework
2. Crea proyectos y aplicaciones de Django.
3. Configurar el proyecto Django
6. Generar especificación OpenAPI
03Funciones avanzadas de Apispec
3. Generar automáticamente documentos de interfaz.
4. Integrar con herramientas de terceros
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.
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.
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.
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
Veamos el uso básico de Apispec a través de algunos ejemplos 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
Agregue rest_framework y apispec en settings.py:
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
En miaplicación/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"})
En miaplicación/urls.py:
- from django.urls import path
- from .views import UserView
-
- urlpatterns = [
- path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
- ]
En administrar.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 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.
- 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 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.
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.
- 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 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.
- 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()
Cree un sistema completo de documentación API
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.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Agregue dependencias en requisitos.txt:
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Ejecute el siguiente comando para instalar dependencias:
pip install -r requirements.txt
Defina el modelo de usuario en 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)
Defina serializadores de usuario en 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)
-
Definir vistas en views.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
En aplicación.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()
Inicie la aplicación ejecutando el siguiente comando:
python app.py
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.
- 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. 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
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.