le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sommario
Installazione e configurazione
Genera semplice documentazione API
2. Definire percorsi e visualizzazioni API
3. Aggiungi il percorso ad Apispec
1. Installare Flask e Flask-Apispec
2. Creare un'applicazione Flask
1. Installa Django e Django-Rest-Framework
2. Crea progetti e applicazioni Django
3. Configura il progetto Django
4. Definire le visualizzazioni Django
6. Genera la specifica OpenAPI
Le funzionalità avanzate di 03Apispec
3. Genera automaticamente documenti di interfaccia
4. Integrazione con strumenti di terze parti
5. Definire visualizzazioni e serializzazione
6. Definire l'applicazione principale
7. Eseguire l'app e visualizzare la documentazione
Visita http://localhost:5000/swagger/ per visualizzare la documentazione dell'API generata.
Introduzione alle specifiche API
Apispec è una libreria Python per generare specifiche OpenAPI (Swagger). Può aiutare gli sviluppatori a generare e gestire automaticamente i documenti API e fornire descrizioni dell'interfaccia intuitive e dettagliate. Attraverso Apispec, possiamo convertire facilmente la stringa di documentazione di una funzione o classe Python in un documento conforme alle specifiche OpenAPI, riducendo il problema di scrivere manualmente la documentazione.
Semplice e facile da usare: Apispec fornisce un'API semplice e facile da usare per iniziare rapidamente.
Flessibile e potente: supporta più framework (come Flask, Django) ed estensioni, consentendo di personalizzare la generazione di documenti in base alle esigenze.
automazione: Riduci le operazioni manuali e i costi di manutenzione generando e aggiornando automaticamente i documenti.
Prima di iniziare a utilizzare Apispec, dobbiamo prima installarlo. Puoi installarlo usando pip:
pip install apispec
Indirizzo del progetto Github:
https://github.com/marshmallow-code/apispec
Diamo un'occhiata all'utilizzo di base di Apispec attraverso alcuni semplici esempi.
- 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
Aggiungi rest_framework e apispec in settings.py:
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
In myapp/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"})
In myapp/urls.py:
- from django.urls import path
- from .views import UserView
-
- urlpatterns = [
- path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
- ]
In Manage.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 fornisce un meccanismo di estensione flessibile che consente di personalizzare i generatori. Puoi implementare la tua logica di generazione ereditando ed estendendo la classe base fornita da 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 supporta una varietà di framework Python popolari, come Flask, Django, Falcon, ecc. Puoi scegliere framework e plug-in appropriati in base alle tue esigenze e generare rapidamente documenti API.
Apispec può generare automaticamente documenti di interfaccia basati sulla stringa di documentazione di una funzione o classe, riducendo il carico di lavoro della scrittura manuale dei documenti.
- 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 può essere integrato con molti strumenti di terze parti, come Swagger UI, ReDoc, ecc., per fornire funzioni di visualizzazione e test dei documenti con interfaccia 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()
Costruisci un sistema di documentazione API completo
Supponiamo di avere un semplice sistema di gestione degli utenti e di dover documentare la sua API. La nostra API include operazioni di aggiunta, eliminazione, modifica e query degli utenti, nonché alcune funzioni di base di autenticazione dell'identità.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Aggiungi le dipendenze in require.txt:
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Eseguire il comando seguente per installare le dipendenze:
pip install -r requirements.txt
Definisci il modello utente in 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)
Definisci i serializzatori utente in 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)
-
Definisci le visualizzazioni in 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
In 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()
Avviare l'applicazione eseguendo il comando seguente:
python app.py
1. Mantieni la documentazione e il codice sincronizzati
Assicurati che la documentazione sia sempre sincronizzata con il codice per evitare incoerenze tra la documentazione e l'API effettiva. È possibile utilizzare gli strumenti CI/CD per generare e distribuire automaticamente la documentazione.
2. Utilizzare annotazioni e decoratori
Utilizzando commenti e decoratori, la documentazione può essere resa più concisa e leggibile. Ad esempio, utilizza il decoratore @doc di Flask-Apispec per aggiungere informazioni sulla documentazione a una funzione di visualizzazione.
3. Definire parametri e risposte globali
Per i parametri e le risposte di uso comune, è possibile definire parametri globali e modelli di risposta in Apispec per ridurre la ripetizione del codice.
- 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. Rivedere e aggiornare regolarmente la documentazione
Rivedere e aggiornare regolarmente la documentazione per garantirne l'accuratezza e la completezza. Ciò può essere ottenuto impostando un ciclo di revisione dei documenti o introducendo un processo di revisione dei documenti.
Per ulteriori funzioni e utilizzo dettagliato, fare riferimento alla documentazione ufficiale:
https://apispec.readthedocs.io/en/latest
Attraverso questo articolo, credo che tu abbia una conoscenza e una padronanza di base di Apispec. Dall'utilizzo di base alle funzioni avanzate, ai casi pratici e alle migliori pratiche, presentiamo in modo completo come utilizzare Apispec per generare e mantenere documenti API.
Spero che tu possa applicare questa conoscenza a progetti reali e aggiungere un tocco di luminosità alla tua API.