【1日1パッケージ】Django Ninja
By JoeVu, at: 2024年5月29日12:32
Estimated Reading Time: __READING_TIME__ minutes
![[One Day One Package] An Overview of Django Ninja](/media/filer_public_thumbnails/filer_public/cf/6f/cf6f4036-7f78-45c7-87bb-55901cc3b80f/django_ninja.png__1500x900_crop_subsampling-2_upscale.png)
![[One Day One Package] An Overview of Django Ninja](/media/filer_public_thumbnails/filer_public/cf/6f/cf6f4036-7f78-45c7-87bb-55901cc3b80f/django_ninja.png__400x240_crop_subsampling-2_upscale.png)
Django Ninjaは、Python 3.6+の型ヒントを使用してDjangoでAPIを構築するために設計された強力なWebフレームワークです。高性能、使いやすさ、Django ORMとの互換性で知られています。以下に、その機能と最近の更新の概要を示します。
主な機能
- 型ヒント:Django Ninjaは、リクエストとレスポンスの検証にPythonの型ヒントを活用し、コードの可読性を向上させ、バグを削減します。
- 高性能:PydanticとStarletteを利用することで、Django Ninjaは高速な実行を提供し、パフォーマンスが重要なアプリケーションに適しています。
- 使いやすさ:このフレームワークは既存のDjangoプロジェクトにシームレスに統合するように設計されており、最小限のボイラープレートコードで済みます。
- 非同期サポート:同期ビューと非同期ビューの両方をサポートし、さまざまなユースケースに対応する柔軟性を提供します。
- 自動ドキュメント生成:OpenAPIドキュメントを自動的に生成し、Webインターフェースを介して簡単にアクセスして操作できます。
- ORM統合:Django ORMと連携して動作し、スムーズなデータベース操作を可能にします。
- 検証:Pydanticモデルを使用した包括的なリクエストとレスポンスの検証により、データの整合性が確保されます。
Django Ninjaにおける困難な問題
Django Ninjaは有望なフレームワークですが、開発者にとって困難な、いくつかの未解決の問題があります。最も注目すべき問題をいくつか紹介します。
-
Pydantic v2との非互換性:Django Ninjaは現在、Pydantic v2との互換性の問題に直面しています。この問題は、Django NinjaではまだサポートされていないPydanticの大きな変更によるものであり、依存関係の更新時に潜在的な中断につながります(GitHub) (GitHub)。
-
GeoDjangoサポート:
PointField
などのGeoDjangoのカスタムフィールドを使用する場合に問題が発生します。これらのフィールドはすぐに使用できる状態ではないため、スキーマ生成中にエラーが発生します。カスタムプロパティを使用したり、型マッピングを手動で更新したりする回避策がありますが、ネイティブサポートはまだ不足しています(GitHub)。
-
OAuth 2統合:Django REST Framework(DRF)が
django-oauth-toolkit
と統合する方法と同様に、OAuth 2統合の組み込みサポートを要求するユーザーがいます。現在、開発者はOAuth 2機能を実現するためにカスタムソリューションを実装する必要があり、これは面倒な場合があります(GitHub)。
-
OpenAPIドキュメントの問題:他のAPIエンドポイントが正常に機能しているのに、OpenAPIドキュメントが正しく表示されないという報告があります。この問題は、多くの場合、URL構成に関連しており、末尾のスラッシュとドキュメントパスの注意深い処理が必要です(GitHub)。
-
PydanticスキーマとOpenAPIの不一致:もう1つの重要な問題は、PydanticスキーマのバージョンとOpenAPIの期待値の不一致です。Pydanticは最新のJSONスキーマドラフトを使用してスキーマを生成しますが、OpenAPIは古いバージョンを期待しています。これにより、コード生成ツールに問題が発生し、スキーマバージョンの注意深い管理が必要になります(GitHub)。
-
ルーターレベルでの認証:ルーターレベルで認証を実装する場合に複雑さが生じます。複数の
NinjaAPI
インスタンスとその構成で問題が発生し、競合と認証エラーにつながります(GitHub)。
-
ModelSchemaパッケージの分離:
ModelSchema
を独自の別のパッケージに分離するという提案があります。現在、開発者はModelSchema
のみが必要な場合でも、Django Ninjaパッケージ全体をインストールする必要があり、これは非効率的で、不要な依存関係につながる可能性があります(GitHub)。
Django NinjaとDjango Rest Frameworkの比較
制限事項
制限事項は、提供された情報源には明示的に記載されていません。パフォーマンス、開発の容易さ、OpenAPIやJSONスキーマなどのAPI標準への準拠など、さまざまな点で優れていますが、潜在的な制限事項としては以下が考えられます。
- エコシステムの不足:DRFと比較してDjango Ninjaにはエコシステムが不足しているため、より多くのボイラープレートコードと追加の実装が必要になる可能性があるとユーザーは述べています
- ボイラープレートコード:一部のユーザーは、Django NinjaのコードはDRFと比較して冗長であり、より多くのボイラープレートが必要になる可能性があり、アーキテクチャ上の課題につながる可能性があると述べています
- カスタム実装:ユーザーは、Django Ninjaでは容易に利用できない独自のトークンクレームロジックやその他の機能を実装する必要があったと報告しており、組み込み機能の潜在的なギャップを示しています
- ビジネスモデルとサポート:Django Ninjaのビジネスモデルとサポートチームの規模について懸念が表明されており、オープンソースプロジェクトのコミュニティサポートとメンテナンスの重要性が強調されています
- DRFとの比較:Django Ninjaは速度と展開の容易さを提供しますが、特定のシナリオの処理や包括的な機能セットの提供において、DRFほど強力ではない可能性があります
例
ステップ1:環境設定
DjangoとDjango Ninjaのインストール:まず、Pythonがインストールされていることを確認します。次に、仮想環境を作成し、DjangoとDjango Ninjaをインストールします。
python -m venv venv
source venv/bin/activate
pip install django django-ninja
新しいDjangoプロジェクトの作成:Djangoのstartproject
コマンドを使用して、新しいプロジェクトを作成します。
django-admin startproject simpleproject
cd simpleproject
新しいDjangoアプリの作成:Djangoのstartapp
コマンドを使用して、プロジェクト内に新しいアプリを作成します。
python manage.py startapp simpleapp
ステップ2:Django Ninjaの設定
APIファイルの作成:アプリディレクトリ(simpleapp
)内に、api.py
という新しいファイルを作成します。
# simpleapp/api.py
from ninja import NinjaAPI
api = NinjaAPI()
@api.get("/hello")
def hello(request):
return {"message": "Hello, world!"}
DjangoのURL構成にAPIを含める:プロジェクトのurls.py
ファイルを編集して、APIのURLを含めます。
# simpleproject/urls.py
from django.contrib import admin
from django.urls import path
from simpleapp.api import api
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', api.urls), # この行を追加
]
ステップ3:アプリケーションの実行
マイグレーションの適用:Djangoに必要な初期マイグレーションを適用します。
python manage.py migrate
開発サーバーの実行:Django開発サーバーを起動します。
python manage.py runserver
APIへのアクセス:Webブラウザを開き、http://127.0.0.1:8000/api/hello
に移動します。JSONレスポンスが表示されます。
{ "message": "Hello, world!" }
ステップ4:アプリケーションの拡張
Pydanticスキーマの作成:リクエスト検証用のPydanticスキーマを定義します。
# simpleapp/api.py
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
POSTエンドポイントの追加:POSTエンドポイントでスキーマを使用します。
# simpleapp/api.py
@api.post("/items")
def create_item(request, item: Item):
return {"item": item.dict()}
POSTエンドポイントのテスト:Postmanやcurl
などのツールを使用して、新しいエンドポイントをテストします。
curl -X POST "http://127.0.0.1:8000/api/items" -H "accept: application/json" -H "Content-Type: application/json" -d '{"name":"Sample Item","description":"A sample item","price":10.99,"tax":0.99}'
送信したアイテムデータを含むレスポンスが返されます。
{ "item": { "name": "Sample Item", "description": "A sample item", "price": 10.99, "tax": 0.99 } }
これで完了です!GETエンドポイントとPOSTエンドポイントを持つシンプルなDjango Ninjaアプリケーションを作成しました。さらにエンドポイントを追加したり、データベースと統合したり、Django Ninjaが提供するその他の機能を利用したりすることで、アプリケーションを拡張できます。
結論
Django Ninjaは、DjangoでAPIを構築するためのモダンで効率的なフレームワークとして際立っています。型ヒントと自動ドキュメントの利用、高性能と使いやすさを組み合わせることで、開発者にとって魅力的な選択肢となっています。ただし、互換性の問題に注意し、コミュニティの回避策を活用することで、このフレームワークを最大限に活用できます。