こんにちは。
グローバルウェイの清家です。
プロジェクトで新規にRESTful API開発に携わる機会があり、一からフレームワークを検討することにしました。Djangoを日常的に使っていることもあり、Djangoに関連するライブラリを中心に選定していきます。今回はそのライブラリの一つであるDjango Ninjaをご紹介します。
この記事は以下の方を対象としています
★4 Python開発経験が3年以上。
★3 Python開発経験が1年以上。
★2 Python 初級者。簡単なプログラムコードが書けます。
★1 プログラミング未経験。
Django Ninjaとは
Django Ninjaは、DjangoとPython 3.6以降の型ヒントを使用してAPIを開発するWEBフレームワークです。ASGIをベースに構築されているため非常に軽量でかつ高速であることや、型ヒントに基づいてリクエストボディやクエリが自動でバリデーションできるなど、迅速かつ安全に開発することができます。
Django REST Framework(DRF)との比較
Djangoの有名なAPIフレームワークの一つにDjango REST Framework(DRF)があります。以下に違いをまとめました。
<Django NinjaとDRFの比較>
項目 | Django Ninja | DRF |
フレームワーク | PydanticとASGIベース | Django標準のフォーム・モデル設計 |
バリデーション | Schemaを使用する 型ヒントに基づいて自動バリデーション | Serializerを使用する |
パフォーマンス | 高速(ASGIサポートによる非同期対応) | 同期ベースだが、ASGIの設定により非同期対応も可能 |
APIドキュメント生成 | 自動でSwagger/OpenAPIをドキュメント生成 | 外部パッケージが必要 |
開発スピード | 型ヒントと自動バリデーションにより迅速に開発できる | 柔軟が高く設定が多い分、学習コストが高い |
人気とコミュニティ | 比較的新しいが、パフォーマンス重視の選択肢として人気が高まっている | 大規模なコミュニティと豊富なドキュメント |
開発環境を構築する
インストール、および、コンテナを起動する
Docker composeコマンドを使用して開発環境を構築します。
※Docker Composeのインストールが必要となります
〔compose.yaml〕 version: ‘3.7’ services: gw-api: container_name: ${CONTAINER_NAME_AP:-gw-api} privileged: true restart: always build: ./skeleton-api image: django_ninja_project_skeleton-api command: tail -f /dev/null volumes: – ./skeleton-api/:/usr/src/api/ ports: – “${HTTP_PORT_AP:-18089}:8089” |
〔Dockerfile〕 FROM python:3.12.6-bullseye WORKDIR /usr/src/api ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN apt-get update RUN apt-get install -y gettext RUN pip install –upgrade pip RUN pip install pip-tools COPY ./requirements.in . RUN pip-compile RUN pip install -r requirements.txt COPY . . |
〔requirements.in〕 Django>=4.2,<4.3 django-ninja |
コンテナを起動します。
〔ターミナル〕 $ docker-compose build –no-cache $ docker-compose up -d $ docker exec -it gw-api bash(コンテナに入る) |
Djangoプロジェクトを作成します。
〔コンテナ〕 # django-admin startproject config . # python3.12 manage.py startapp api |
APIを動かしてみよう
GETメソッドの簡単なAPIを作成してみましょう。
〔パッケージ構成〕 |
〔views.py〕 from django.shortcuts import render from ninja import Router router = Router() @router.get(“/hello/”) def hello(request): return “Hello World!” |
〔urls.py〕 from django.contrib import admin from django.urls import path from ninja import NinjaAPI from api.views import router api = NinjaAPI() api.add_router(“/v1/”, router) urlpatterns = [ path(“admin/”, admin.site.urls), path(“”, api.urls), ] |
ここまでで動作の準備は整いました。実際にブラウザやRESTクライアントツールを使ってアクセスしてみましょう。
〔ブラウザ等〕 http://localhost/v1/hello/ HTTPステータス:200とともに応答が返ってくれば成功です。 “Hello World!” |
まとめ
Django Ninjaを使ってGETメソッドのAPIを動かすところまで確認しました。
Django NinjaはAPI開発をシンプルかつ強力にサポートできるフレームワークです。開発者は迅速かつ簡潔に実装できることがわかるはずです。ぜひ一度利用してみてください。次回ではバリデーションの実装などDjango Ninjaを掘り下げていきたいと思います。
弊社は愛媛県進出に向けてさまざまな取り組みを実施しております。松山市では定期的にPythonセミナーを開催しておりますので、ぜひ関心をお持ちいただければと思います。
グローバルウェイが愛媛県進出に向けて発信。その想いとは_其の一(https://www.globalway-recruit.com/blog/expandintoehime01/)
参考文献