【Django】Django REST FrameworkでSwagger(OpenAPI)を導入して、API仕様書を作成する
完成図
Swaggerの画面
Redocの画面
drf-yasgをインストール
drf-yasg==1.21.7 # JSON形式、YAML形式でのAPI仕様書を自動生成してくれる
djangorestframework==3.14.0
settings.pyにdrf-yasgを追加
INSTALLED_APPS = [
'drf_yasg',
'rest_framework',
]
settings.pyにSwaggerとDRFの設定を追加
settings.pyへの追記
# REST Framework設定
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
],
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.MultiPartParser',
],
}
# Swagger用の設定を追加
SWAGGER_SETTINGS = {
'SECURITY_DEFINITIONS': {
'Bearer': {
'type': 'apiKey',
'name': 'Authorization',
'in': 'header',
'description': 'JWT Authorization header using the Bearer scheme. Example: "Bearer {token}"'
}
},
'USE_SESSION_AUTH': False,
'JSON_EDITOR': True,
'SUPPORTED_SUBMIT_METHODS': [
'get',
'post',
'put',
'delete',
'patch'
],
}
urls.pyにSwaggerのURLパターンを追加
from django.urls import path, include, re_path # re_pathを用いるとURLを正規表現(柔軟なURL指定)が可能。
from drf_yasg.views import get_schema_view # Swagger UI 用のビューを作る関数
from drf_yasg import openapi
from rest_framework import permissions # DRFの認可(パーミッション)機能.APIドキュメントが誰に公開されるかをコントロールするために使う。
# Swagger設定
schema_view = get_schema_view(
openapi.Info( # 以下の情報は、Swagger UIの画面上部に「このAPIはこういうものです」と表示される。
title="API",
default_version='v1',
description="API仕様書",
terms_of_service="https://www.---.com/terms/",
contact=openapi.Contact(email="contact@---.com"),
license=openapi.License(name="Private License"),
),
public=True,
permission_classes=(permissions.AllowAny,),
authentication_classes=[],
)
urlpatterns = [
# Swagger UI
re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), # redocは、Swagger UI よりシンプルな見た目で、API仕様を読むのに適している。
]
APIメモ
・APIは一般にHTTPリクエスト/レスポンスのやりとりで動く。
・どんなエンドポイントまたはパラメータを渡すのかを一覧(API仕様書)にすると便利。
・手書きでこれをまとめたものが「APIドキュメント」だが、ミスが発生するのを避けるため、標準的なものが作成された。
・標準フォーマットにしたのがOpenAPI Specification (OAS)
。である
・OpenAPI形式のAPI仕様 = APIの構造・入力・出力・説明などを 機械可読な JSON / YAMLファイル にまとめたもの。
・Swagger UI = それをきれいに「画面表示」してくれるツール。
・drf-yasg のようなツールを使うとDjangoのAPIエンドポイントを自動でスキャンしてSwagger / OpenAPI形式 の仕様ファイル(JSON/YAML)を自動で生成しSwagger UI画面にリアルタイムで表示することができる。
・特にオープンAPIを公開する時は YAML が一般的。
Django REST Framework の API実装
↓
drf-yasg が API構造を解析
↓
OpenAPI Specification (JSON / YAML形式) を自動生成
↓
Swagger UI がそれを画面に表示 (Swagger / Redoc)
【応用】APIテスト実装時
JWTトークンを生成する
Try it out
➡ ログインのmailとPassを入力 ➡ Exetute
を押す ➡ JWTトークンを生成する
JWSを使用しない場合のAuthorize認証
Authorizeをクリックしてユーザーでログインする
JWTトークンを設定
JWTトークンをSwagger上部のAuthorizeのBearer認証フィールドに先ほど取得したaccessトークンを入力する
Bearer認証
- Bearer認証
・OAuth 2.0で広く使用されているHTTP認証スキーム。
・トークンベースの認証方式で、トークンをHTTPヘッダに含めてリクエストすることでユーザーの認証・認可を行う。
・「デジタル署名による改ざん検知」と「パスワードの非送信」が主なセキュリティメリット。
【応用】API仕様書の表示
http://localhost:8000/swagger.json
http://localhost:8000/swagger.yaml
http://localhost:8000/redoc/
Discussion