Technology sharing

Apispec, bibliotheca Pythonis OpenAPI generandi (Swagger) specifications

2024-07-12

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

Tabula contentorum

01What est APIspec?

Cur Apispec eligere?

Installation et configuratione

02Basic usus Apispec

Generare simplex API documenta

1. crea in Apispec exempli gratia

2. Definire API itineribus ac views

3. Add iter ad Apispec

Integrate Vas et APIspec

1. Install Flask et Flask-Apispec

2. crea in application utrem

Integrate Django et APIspec

1. Install Django et Django-Requiem-Framework

2. crea Django incepta et applicationes

3. Configure Django project

4. Define Django views

5. Configure URL

6. OpenAPI generale speciem

03Apispec provectis

1. Custom generantis

2. Support plures compages

3. Automatarie generate documentorum interface

4. Integrate cum tertia-pars instrumenta

04Practical casibus

1. Project Introduction

2. Project structure

3. Install clientelas

4. Definire exemplum

5. Definire views ac serialization

6. Definire pelagus application

7. Curre in app ac videre documenta

Visita http://localhost:5000/swagger/ videre generatum API documentum.

05Best Practices

06 Summarium



01Quid est APIspec?

Introductio ad APIspecs

Apispec bibliotheca Python est OpenAPI (Swagger) species generandi. Potest auxilium tincidunt automatice API documenta generare et conservare et descriptiones intuitivas et distinctissimas instrumenti praebere. Per Apispec documenta chorda Pythonis functionis vel classis facile convertere possumus in documentum quod specificationi OpenAPI congruit, molestiam manualem scriptionis documentorum minuens.

Cur Apispec eligere?

  • Simplex et facilis ad usum: Apispec API simplex et facile utendum praebet ut cito incipias.

  • Flexibile et potentem: Sustinet plures compages (ut Flask, Django) et extensiones, permittens te generationi documenti customize ut opus sit.

  • automation: Operationes manuales et sustentationem minuere sumptibus automatice documentis generandis et adaequationis.

Installation et configuratione

Priusquam incipimus uti Apispec, necesse est ut eam prius instituam. Potes eam uti pituitam instituere:

pip install apispec

Github project inscriptio:

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

02Basic usus APIspec

Intueamur usum fundamentalem Apispec per pauca simplicia exempla.

Generare simplex API documenta

1. crea in Apispec exempli gratia

  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. Definire API itineribus ac views

  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. Add iter ad 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. )

Integrate Vas et APIspec

1. Install Flask et Flask-Apispec

pip install Flask Flask-Apispec

2. crea in application utrem

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

Integrate Django et APIspec

1. Install Django et Django-Requiem-Framework

pip install django djangorestframework

2. crea Django incepta et applicationes

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

3. Configure Django project

Add rest_framework et apispec in settings.py:

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

4. Define Django views

In myapp/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. Configure URL

In myapp/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. OpenAPI generale speciem

in manage.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())

03Provectus lineamenta APIspec

1. Custom generantis

APIspec extensio mechanismum flexibilem praebet quae te generantibus domiciliis concedit. Potes efficere logicam suam generationem tuam possidendo et ampliando genus basis ab Apispec provisum.

  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. Support plures compages

Apispec varias tabulas Pythonis populares sustinet, ut Flask, Django, Falcon, etc. Potes aptas tabulas eligere et obturaculum secundum necessitates tuas ut documenta API cito gignant.

3. Automatarie generate documentorum interface

Apispec statim generare potest documenta interfaciei innixa in chorda documenti functionis vel classis, reducendo inposuit quod inposuit documentorum manualium scripto.

  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. Integrate cum tertia-pars instrumenta

Apispec integrari potest cum multis instrumentis tertiae factionis, ut Swagger UI, ReDoc, etc., ut documentum intuitivum instrumenti interfaciei praebeat et functiones experiatur.

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

04Causae practicae

Aedificare completum API documentis ratio

1. Project Introduction

Ponamus nos simplicem usoris administratione rationem habere et opus API eius documento habere. Nostra API user additionem, deletionem, modificationem et interrogationes operationes includit, ac quaedam functiones authenticas fundamentales identitatis.

2. Project structure

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

3. Install clientelas

Adde clientelas in requirements.txt:

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

Hoc mandatum est curre clientelas install:

pip install -r requirements.txt

4. Definire exemplum

Define usoris exemplar in 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. Definire views ac serialization

Define user serializers in 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)

Define views in 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. Definire pelagus application

In 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. Curre in app ac videre documenta

Incipit per applicationem currit hoc mandatum:

python app.py

Visita http://localhost:5000/swagger/ videre generatum API documentum.

05Optimus exercitia

1. Documenta custodi et code in sync

Curare documenta semper in sync cum codice ad vitandas repugnantias inter documenta et ipsam API. CI/CD instrumenta uti potes ad documenta sponte generanda et explicanda.

2. Annotationibus et ornamentis utere

Adhibitis annotationibus et ornamentis, documentum brevius et lectabile fieri potest. Exempli gratia, usus est ornamento Flask-Apispec @doc ornatum ad informationes documentorum ad visum munus addere.

3. Definire global parametri et respondeo

Pro parametris et responsionibus communiter adhibitis, parametri globalis et solutionum responsionum definiri possunt in Apispec ad iterandum codicem reducendum.

  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. Regulariter review ac update documenta

Regulariter recensere et renovare documenta ut accurationem et perfectionem curent. Quod fieri potest ut instituatur documentum cycli recensionis vel documentum processus retractationis introducendo.

Ad plura munera et accuratiores usus, ad documenta publica referre placet;

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

06summarium

Per hunc articulum, credo, te Apispec praecipuum intellectum et magisterium habere. Ex usu fundamentali ad functiones provectas, ad causas practicas et ad optimos usus, comprehendimus comprehendimus quomodo Apispec utatur ad documenta generanda et conservanda API.

Spero te hanc scientiam ad incepta actualia applicare et tactum claritatis tuis API addere.