Django Ninjaを使ってみる

こんにちは。

グローバルウェイの清家です。

プロジェクトで新規に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 NinjaDRF
フレームワーク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/

参考文献

Django Ninja – Fast Django REST Framework

この記事が気に入ったら
いいね または フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
目次