Обмен технологиями

Apispec, библиотека Python для создания спецификаций OpenAPI (Swagger).

2024-07-12

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

Оглавление

01Что такое APIspec?

Почему стоит выбрать Apispec?

Установка и настройка

02Основы использования Apispec

Создать простую документацию по API

1. Создайте экземпляр Apispec.

2. Определите маршруты и представления API.

3. Добавьте путь к Apispec.

Интеграция Flask и APIspec

1. Установите Flask и Flask-Apispec.

2. Создайте приложение Flask.

Интегрируйте Django и APIspec.

1. Установите Django и Django-Rest-Framework.

2. Создание проектов и приложений Django.

3. Настройте проект Django.

4. Определите представления Django

5. Настройте URL-адрес

6. Создайте спецификацию OpenAPI.

03Расширенные функции Apispec

1. Пользовательский генератор

2. Поддержка нескольких фреймворков

3. Автоматически генерировать интерфейсные документы

4. Интеграция со сторонними инструментами

04Практические кейсы

1. Введение в проект

2. Структура проекта

3. Установите зависимости

4. Определите модель

5. Определите представления и сериализацию

6. Определите основное приложение

7. Запустите приложение и просмотрите документацию.

Посетите http://localhost:5000/swagger/, чтобы просмотреть созданную документацию по API.

05Лучшие практики

06 Резюме



01Что такое APIspec?

Введение в спецификации API

Apispec — это библиотека Python для создания спецификаций OpenAPI (Swagger). Он может помочь разработчикам автоматически создавать и поддерживать документы API, а также предоставлять интуитивно понятные и подробные описания интерфейса. С помощью Apispec мы можем легко преобразовать строку документации функции или класса Python в документ, соответствующий спецификации OpenAPI, что упрощает написание документации вручную.

Почему стоит выбрать Apispec?

  • Легко и просто использовать: Apispec предоставляет простой и удобный API, позволяющий быстро приступить к работе.

  • Гибкий и мощный: поддерживает несколько фреймворков (таких как Flask, Django) и расширений, что позволяет настраивать создание документов по мере необходимости.

  • автоматизация: Сократите затраты на ручные операции и обслуживание за счет автоматического создания и обновления документов.

Установка и настройка

Прежде чем мы начнем использовать Apispec, нам необходимо сначала его установить. Вы можете установить его с помощью pip:

pip install apispec

Адрес проекта на Github:

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

02Базовое использование APIspec

Давайте рассмотрим базовое использование Apispec на нескольких простых примерах.

Создать простую документацию по API

1. Создайте экземпляр 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. Определите маршруты и представления 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. Добавьте путь к 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. )

Интеграция Flask и APIspec

1. Установите Flask и Flask-Apispec.

pip install Flask Flask-Apispec

2. Создайте приложение 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()

Интегрируйте Django и APIspec.

1. Установите Django и Django-Rest-Framework.

pip install django djangorestframework

2. Создание проектов и приложений Django.

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

3. Настройте проект Django.

Добавьте rest_framework и apispec в settings.py:

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

4. Определите представления Django

В 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. Настройте URL-адрес

В 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.

В файле 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())

03Расширенные возможности APIspec

1. Пользовательский генератор

APIspec предоставляет гибкий механизм расширения, позволяющий настраивать генераторы. Вы можете реализовать свою собственную логику генерации, унаследовав и расширив базовый класс, предоставленный 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. Поддержка нескольких фреймворков

Apispec поддерживает множество популярных платформ Python, таких как Flask, Django, Falcon и т. д. Вы можете выбрать подходящие платформы и плагины в соответствии с вашими потребностями и быстро генерировать документы API.

3. Автоматически генерировать интерфейсные документы

Apispec может автоматически генерировать документы интерфейса на основе строки документации функции или класса, уменьшая рабочую нагрузку при написании документов вручную.

  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. Интеграция со сторонними инструментами

Apispec можно интегрировать со многими сторонними инструментами, такими как Swagger UI, ReDoc и т. д., чтобы обеспечить интуитивно понятный интерфейс отображения документов и функции тестирования.

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

04Практические случаи

Создайте полную систему документации API.

1. Введение в проект

Предположим, у нас есть простая система управления пользователями и нам необходимо документировать ее API. Наш API включает в себя операции добавления, удаления, изменения и запроса пользователей, а также некоторые базовые функции аутентификации личности.

2. Структура проекта

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

3. Установите зависимости

Добавьте зависимости в файл require.txt:

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

Запустите следующую команду, чтобы установить зависимости:

pip install -r requirements.txt

4. Определите модель

Определите модель пользователя в файле 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. Определите представления и сериализацию

Определите пользовательские сериализаторы в сериализаторах.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)

Определите представления в view.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. Определите основное приложение

В 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. Запустите приложение и просмотрите документацию.

Запустите приложение, выполнив следующую команду:

python app.py

Посетите http://localhost:5000/swagger/, чтобы просмотреть созданную документацию по API.

05Лучшие практики

1. Синхронизируйте документацию и код

Убедитесь, что документация всегда синхронизирована с кодом, чтобы избежать несоответствий между документацией и реальным API. Вы можете использовать инструменты CI/CD для автоматического создания и развертывания документации.

2. Используйте аннотации и декораторы

Используя комментарии и декораторы, документацию можно сделать более краткой и читабельной. Например, используйте декоратор @doc Flask-Apispec, чтобы добавить информацию документации в функцию просмотра.

3. Определите глобальные параметры и ответы.

Для часто используемых параметров и ответов в Apispec можно определить глобальные параметры и шаблоны ответов, чтобы уменьшить количество повторяющегося кода.

  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. Регулярно просматривайте и обновляйте документацию.

Регулярно проверяйте и обновляйте документацию, чтобы обеспечить ее точность и полноту. Этого можно достичь, установив цикл проверки документов или внедрив процесс проверки документов.

Дополнительные функции и подробное описание использования можно найти в официальной документации:

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

06краткое содержание

Я уверен, что благодаря этой статье вы получили базовое понимание и освоили Apispec. От базового использования до расширенных функций, практических примеров и лучших практик — мы подробно рассказываем, как использовать Apispec для создания и поддержки документов API.

Я надеюсь, что вы сможете применить эти знания в реальных проектах и ​​добавить яркости своему API.