моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Оглавление
02Основы использования Apispec
Создать простую документацию по API
1. Создайте экземпляр Apispec.
2. Определите маршруты и представления API.
1. Установите Flask и Flask-Apispec.
Интегрируйте Django и APIspec.
1. Установите Django и Django-Rest-Framework.
2. Создание проектов и приложений Django.
4. Определите представления Django
6. Создайте спецификацию OpenAPI.
2. Поддержка нескольких фреймворков
3. Автоматически генерировать интерфейсные документы
4. Интеграция со сторонними инструментами
5. Определите представления и сериализацию
6. Определите основное приложение
7. Запустите приложение и просмотрите документацию.
Посетите http://localhost:5000/swagger/, чтобы просмотреть созданную документацию по API.
Введение в спецификации API
Apispec — это библиотека Python для создания спецификаций OpenAPI (Swagger). Он может помочь разработчикам автоматически создавать и поддерживать документы API, а также предоставлять интуитивно понятные и подробные описания интерфейса. С помощью Apispec мы можем легко преобразовать строку документации функции или класса Python в документ, соответствующий спецификации OpenAPI, что упрощает написание документации вручную.
Легко и просто использовать: Apispec предоставляет простой и удобный API, позволяющий быстро приступить к работе.
Гибкий и мощный: поддерживает несколько фреймворков (таких как Flask, Django) и расширений, что позволяет настраивать создание документов по мере необходимости.
автоматизация: Сократите затраты на ручные операции и обслуживание за счет автоматического создания и обновления документов.
Прежде чем мы начнем использовать Apispec, нам необходимо сначала его установить. Вы можете установить его с помощью pip:
pip install apispec
Адрес проекта на Github:
https://github.com/marshmallow-code/apispec
Давайте рассмотрим базовое использование Apispec на нескольких простых примерах.
- 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
Добавьте rest_framework и apispec в settings.py:
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
В 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"})
В myapp/urls.py:
- from django.urls import path
- from .views import UserView
-
- urlpatterns = [
- path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
- ]
В файле 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 предоставляет гибкий механизм расширения, позволяющий настраивать генераторы. Вы можете реализовать свою собственную логику генерации, унаследовав и расширив базовый класс, предоставленный 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 поддерживает множество популярных платформ Python, таких как Flask, Django, Falcon и т. д. Вы можете выбрать подходящие платформы и плагины в соответствии с вашими потребностями и быстро генерировать документы API.
Apispec может автоматически генерировать документы интерфейса на основе строки документации функции или класса, уменьшая рабочую нагрузку при написании документов вручную.
- 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 можно интегрировать со многими сторонними инструментами, такими как Swagger UI, ReDoc и т. д., чтобы обеспечить интуитивно понятный интерфейс отображения документов и функции тестирования.
- 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()
Создайте полную систему документации API.
Предположим, у нас есть простая система управления пользователями и нам необходимо документировать ее API. Наш API включает в себя операции добавления, удаления, изменения и запроса пользователей, а также некоторые базовые функции аутентификации личности.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Добавьте зависимости в файл require.txt:
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Запустите следующую команду, чтобы установить зависимости:
pip install -r requirements.txt
Определите модель пользователя в файле 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)
Определите пользовательские сериализаторы в сериализаторах.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)
-
Определите представления в view.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
В 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()
Запустите приложение, выполнив следующую команду:
python app.py
1. Синхронизируйте документацию и код
Убедитесь, что документация всегда синхронизирована с кодом, чтобы избежать несоответствий между документацией и реальным API. Вы можете использовать инструменты CI/CD для автоматического создания и развертывания документации.
2. Используйте аннотации и декораторы
Используя комментарии и декораторы, документацию можно сделать более краткой и читабельной. Например, используйте декоратор @doc Flask-Apispec, чтобы добавить информацию документации в функцию просмотра.
3. Определите глобальные параметры и ответы.
Для часто используемых параметров и ответов в Apispec можно определить глобальные параметры и шаблоны ответов, чтобы уменьшить количество повторяющегося кода.
- 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. Регулярно просматривайте и обновляйте документацию.
Регулярно проверяйте и обновляйте документацию, чтобы обеспечить ее точность и полноту. Этого можно достичь, установив цикл проверки документов или внедрив процесс проверки документов.
Дополнительные функции и подробное описание использования можно найти в официальной документации:
https://apispec.readthedocs.io/en/latest
Я уверен, что благодаря этой статье вы получили базовое понимание и освоили Apispec. От базового использования до расширенных функций, практических примеров и лучших практик — мы подробно рассказываем, как использовать Apispec для создания и поддержки документов API.
Я надеюсь, что вы сможете применить эти знания в реальных проектах и добавить яркости своему API.