기술나눔

OpenAPI(Swagger) 사양을 생성하기 위한 Python 라이브러리인 Apispec

2024-07-12

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

목차

01APIspec이란 무엇인가요?

Apispec을 선택하는 이유는 무엇입니까?

설치 및 구성

02Apispec의 기본 사용법

간단한 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 사양 생성

03Apispec의 고급 기능

1. 맞춤형 생성기

2. 다양한 프레임워크 지원

3. 인터페이스 문서 자동 생성

4. 타사 도구와 통합

04실용사례

1. 프로젝트 소개

2. 프로젝트 구조

3. 종속성 설치

4. 모델 정의

5. 뷰 ​​및 직렬화 정의

6. 기본 애플리케이션 정의

7. 앱을 실행하고 설명서를 확인하세요

생성된 API 문서를 보려면 http://localhost:5000/swagger/를 방문하세요.

05모범 사례

06 요약



01APIspec이란 무엇입니까?

API사양 소개

Apispec은 OpenAPI(Swagger) 사양을 생성하기 위한 Python 라이브러리입니다. 개발자가 API 문서를 자동으로 생성 및 유지 관리하고 직관적이고 자세한 인터페이스 설명을 제공하는 데 도움이 될 수 있습니다. Apispec을 통해 Python 함수 또는 클래스의 문서 문자열을 OpenAPI 사양을 준수하는 문서로 쉽게 변환하여 수동으로 문서를 작성하는 수고를 줄일 수 있습니다.

Apispec을 선택하는 이유는 무엇입니까?

  • 간단하고 사용하기 쉬운: Apispec은 간단하고 사용하기 쉬운 API를 제공하므로 빠르게 시작할 수 있습니다.

  • 유연하고 강력함: 여러 프레임워크(예: Flask, Django) 및 확장을 지원하므로 필요에 따라 문서 생성을 사용자 정의할 수 있습니다.

  • 오토메이션: 문서를 자동으로 생성하고 업데이트하여 수동 운영 및 유지 관리 비용을 절감합니다.

설치 및 구성

Apispec을 사용하기 전에 먼저 설치해야 합니다. pip를 사용하여 설치할 수 있습니다.

pip install apispec

Github 프로젝트 주소:

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

02APIspec의 기본 사용법

몇 가지 간단한 예를 통해 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 프로젝트 구성

settings.py에 Rest_framework 및 apispec을 추가합니다.

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

03APIspec의 고급 기능

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은 Flask, Django, Falcon 등과 같은 널리 사용되는 다양한 Python 프레임워크를 지원합니다. 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. 종속성 설치

요구사항.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. 뷰 ​​및 직렬화 정의

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)

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. 기본 애플리케이션 정의

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

생성된 API 문서를 보려면 http://localhost:5000/swagger/를 방문하세요.

05모범 사례

1. 문서와 코드를 동기화 상태로 유지하세요

문서와 실제 API 간의 불일치를 방지하려면 문서가 항상 코드와 동기화되어 있는지 확인하세요. CI/CD 도구를 사용하여 문서를 자동으로 생성하고 배포할 수 있습니다.

2. 주석과 데코레이터를 사용하세요

주석과 데코레이터를 사용하면 문서를 더욱 간결하고 읽기 쉽게 만들 수 있습니다. 예를 들어 Flask-Apispec의 @doc 데코레이터를 사용하여 보기 기능에 문서 정보를 추가합니다.

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에 밝기를 추가할 수 있기를 바랍니다.