Slide 1

Slide 1 text

Django Ninjaで高速なAPI開発を実現する 実践ガイドとベストプラクティス

Slide 2

Slide 2 text

自己紹介 加藤 雅也 2021/04 ~ 2024/03 新卒で受託開発企業 2024/04 ~ Recustomer株式会社 普段はバックエンドとフロントエンドと開発に従事 @mmmm70641 氏名 経歴

Slide 3

Slide 3 text

本セッションについて

Slide 4

Slide 4 text

このセッションについて 対象 目標 話さないこと DjangoNinjaというライブラリについての知見を得てもらい、今後Djangoプロジェクトに APIを追加したいとなった時の選択肢の一つになってほしい e 既存のDjangoプロジェクトにAPIを追加したいと思っている人 e Djangoについて e REST APIについて e 既存のDjangoプロジェクトでAPI開発をしている人

Slide 5

Slide 5 text

目次 DjangoNinjaとは 1 DjangoNinjaの特徴 2 実際のコードを見てみよう 3 最後に 4

Slide 6

Slide 6 text

Django Ninjaとは

Slide 7

Slide 7 text

Django Ninjaとは Djangoのエコシステムを活用しつつ、 FastAPIライクなAPIを構築することができるWebフレームワーク Django と組み合わせて使う、コントローラー層をサポートしてくれるライブラリ リクエストのルーティングや入出力のスキーマの定義が簡単にできる

Slide 8

Slide 8 text

Django Ninjaとは スター数 初回リリース日 最新リリース日 最新バージョン DjangoNinja 約7,000 2019/12/04 2024/08/15 1.3.0 DjangoRestFramework 約28,200 2011/02/20 2024/06/19 3.15.2 pypi(https://pypi.org/)より参照

Slide 9

Slide 9 text

Django Ninjaの特徴 型ヒント対応による 自動バリデーションと ドキュメント生成 型ヒントと自動ドキュメントにより、 ビジネス ロジックのみに集中できま す。 シンプルな設計と高速 なパフォーマンス Pydanticと非同期サポートにより、非 常に高いパフォーマンスを実現しま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。

Slide 10

Slide 10 text

Django Ninjaの特徴 型ヒント対応による 自動バリデーションと ドキュメント生成 型ヒントと自動ドキュメントにより、 ビジネス ロジックのみに集中できま す。 シンプルな設計と 高速なパフォーマンス Pydanticと非同期サポートにより、 非常に高いパフォーマンスを実現しま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。

Slide 11

Slide 11 text

シンプルな設計と高速なパフォーマンス 使いやすく直感的に操作できる 1 非同期ビューを最大限に活用した高速なパフォーマンスを実現 2

Slide 12

Slide 12 text

使いやすく直感的に操作できる FastAPI DjangoRestFramework 1 2 3 4 5 6 7 from import rest_framework.views APIView ( ): ( , ): ... class def UserListAPIView APIView """ユーザーのリストを取得します""" get self request 1 2 3 4 5 6 7 8 from import fastapi FastAPI api = FastAPI() ( , =list[Hoge]) (): ... @api.get get_users "/users/" """ユーザーのリストを取得します""" response_model def

Slide 13

Slide 13 text

使いやすく直感的に操作できる 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from import ninja NinjaAPI api = NinjaAPI() ( , =UserOut) ( ): ... ( , =UserOut) ( , : ): ... ( , =UserOut) ( , : UserIn): ... @api.get get_users @api.get get_user @api.post create_user "/users/" """ユーザーのリストを取得します""" "/users/ /" """特定のユーザーを取得します""" "/users/ /" """新しいユーザーを作成します""" response request response request user_id response request data def {user_id} def {user_id} def int DjangoNinja

Slide 14

Slide 14 text

使いやすく直感的に操作できる 1 2 3 4 5 6 7 8 from import ninja NinjaAPI api = NinjaAPI() ( , =UserOut) ( ): ... @api.get get_users "/users/" """ユーザーのリストを取得します""" response request def DjangoNinja 1 2 3 4 5 6 7 8 from import fastapi FastAPI api = FastAPI() ( , =list[Hoge]) (): ... @api.get get_users "/users/" """ユーザーのリストを取得します""" response_model def FastAPI

Slide 15

Slide 15 text

高速なパフォーマンス Django Ninja → 約750リクエスト/秒 Flask + Marshmallow → 約750リクエスト/秒 Django REST Framework → 約500リクエスト/秒 「1つのリクエストのみ処理する」という条件の場合 Flask + Marshmallow Django REST Framework DjangoNinja DjangoNinja公式ドキュメント(https://django-ninja.dev/guides/async-support/)から参照

Slide 16

Slide 16 text

高速なパフォーマンス DjangoNinja公式ドキュメント(https://django-ninja.dev/guides/async-support/)から参照 DjangoNinjaの非同期ビューを使用し、並列処理で50のリクエストを処理しながら、 遅いネットワーク操作を呼び出す場合の、1秒あたりのリクエスト数を測定しています。 グラフは、使用するワーカーの数(1から24まで)による性能の違いを示しています。 Flask + Marshmallow Django REST Framework DjangoNinja

Slide 17

Slide 17 text

非同期ビューを最大限に活用した高速なパフォーマンスを実現 1 2 3 4 5 6 7 8 import return time ( ) ( , : , : ): time.sleep(dalay) { : word} # 指定された秒数だけスリープして単語を返す処理 @api.get say_after "/say-after" "saying" def request delay word int str 1 2 3 4 5 6 7 8 import await return asyncio ( ) ( , : , : ): asyncio.sleep(dalay) { : word} # 指定された秒数だけスリープして単語を返す処理 @api.get say_after "/say-after" "saying" async def request delay word int str 同期処理 非同期処理

Slide 18

Slide 18 text

Django Ninjaの特徴 型ヒント対応による 自動バリデーションと ドキュメント生成 型ヒントと自動ドキュメントにより、 ビジネス ロジックのみに集中できま す。 高速なパフォーマンス Pydanticと非同期サポートにより、 非常に高いパフォーマンスを実現しま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。

Slide 19

Slide 19 text

型ヒント対応による自動バリデーションとドキュメント作成 Pydanticを利用した型定義ができる SwaggerUIを使ったドキュメントが自動生成される 2 1

Slide 20

Slide 20 text

Pydanticを利用した型定義ができる Pydanticとは pythonの標準的な型ヒントを利用して、入力データが期待される型に従っているかを自動的にチェックするライブラリ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from import pydantic BaseModel ( ): : name: user = User( = , = ) (user.id) (user.name) user = User( = , = ) class User BaseModel int str id print print # データのインスタンス化 # 1 # hoge # 型が合わない場合 # -> ValidationError: id should be an integer id name id name 1 "hoge" "not number" "hoge"

Slide 21

Slide 21 text

Pydanticを利用した型定義ができる 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # SchemaはpydanticのBaseModelを継承している # 禁止ワード # 禁止ワードがパスワードに含まれているかどうかのバリデーション # ... from import for in if raise return ninja Schema forbidden_words: list[ ] = [ , , ] ( ): username: password: ( ) ( , ): forbidden_word forbidden_words: forbidden_word value: ( forbidden ) value ( ) ( , : UserIn): user = User( =data.username) user.set_password(data.password) str UserIn Schema str str ValueError "aaa" "iii" "uuu" 'password' "Password must not contain: " "/users/" class def in f { } def @validator forbidden_words @api.post create_user cls value request data username

Slide 22

Slide 22 text

SwaggerUIで生成されたAPIドキュメントが自動生成される

Slide 23

Slide 23 text

Django Ninjaの特徴 型ヒント対応による 自動バリデーションと ドキュメント生成 型ヒントと自動ドキュメントにより、 ビジネス ロジックのみに集中できま す。 高速なパフォーマンス Pydanticと非同期サポートにより、 非常に高いパフォーマンスを実現しま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。

Slide 24

Slide 24 text

Djangoとのシームレスの統合 DjangoORMとのシームレスな統合 Djangoミドルウェアや認証システムとの互換性 2 1

Slide 25

Slide 25 text

DjangoORMとのシームレスな統合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from import from import from import return django.shortcuts get_object_or_404 .models Blog ninja Schema ( ): : title: ( , =BlogOut) ( , : ): blog: Blog = get_object_or_404(Blog, = ) blog class {id} def BlogOut Schema int str int id @api.get get_blog id "/blog/ " """新しいユーザーを作成します""" response request id id Ù DjangoのORMをそのまま活用できるため、既存のモデルやデータベースとのやり取りがスムー© Ù DjangoのQuerySetやモデルインスタンスをそのまま返すことができるため、既存のDjangoアプリ ケーションのロジックを再利用しつつ、APIを簡単に作成できる

Slide 26

Slide 26 text

Djangoミドルウェアや認証システムとの互換性 1 2 3 4 5 6 7 from import ninja.security django_auth ( , =django_auth) ( ): user = request.auth ... @api.get secure_endpoint "/secure-data" auth request def DjangoNinjaはDjangoのミドルウェアや認証システムと完全に互換性があり、 例えば、既存の認証機構(DjangoのUserモデルやdjango.contrib.auth)を再利用して、APIに対して 簡単に認証・認可を導入できる Djangoのカスタムミドルウェアもそのまま利用できるため、プロジェクトに既に導入済みのセキュ リティ、ログ、トランザクション管理などの仕組みをAPIに拡張することが可能

Slide 27

Slide 27 text

ここまでのまとめ 特徴 Django Ninja FastAPI REST Framework シンプルな設計と 高速なパフォーマンス Djangoの機能を活かしつ つ、型ヒントを活用した直感 的な開発 型ヒントを活用した直感的な 開発 Djangoの機能を活かしなが らAPIを構築するため 型ヒント対応による 自動バリデーションと ドキュメント生成 Pydanticを利用した容易なバ リデーション Pydanticを利用した容易なバ リデーション 独自のバリデーションクラス を利用するのが一般的 Djangoとのシームレスな統合 シームレスな統合が可能 Djangoとの統合が難しい シームレスな統合が可能

Slide 28

Slide 28 text

なぜRecustomerでDjangoNinjaを採用したか 6 Djangoで積み上げてきたものを生かしつつ、高速なAPI開発を実現したかったから 6 DjangoRestFrameworkなども候補にあったが、将来的にスピードの要件は必須に なることは目に見えていたため、DjangoNinjaを採用した

Slide 29

Slide 29 text

Recustomer 購入体験プラットフォーム プロダクト 返品キャンセルのCSおよび 倉庫業務を自動化 返品キャンセル お届け日時 3月16日(水) 配達完了 配送状況 配送業者 ヤマト運輸 受取り日時を変更 追跡番号:12345678900 3月29日 07:27 am 配達完了 日本, 東京都港区 もっと見る 返品をしたい場合はこちら 購入後の配送追跡から 新たな顧客接点を創り出す 配送追跡

Slide 30

Slide 30 text

簡単なシステム構成図 エンドユーザー ECストア 大量の注文 バックエンド 返品/キャンセル Django 認証 FastAPI 注文管理 配送追跡 Django Django Ninja Django Django Ninja Django Django Ninja Next.js React フロントエンド

Slide 31

Slide 31 text

実際にどのように運用しているか ここからはVSCodeで

Slide 32

Slide 32 text

実際に実務で使っていて、 DjangoNinjaのどこがよい?

Slide 33

Slide 33 text

実際に実務で使っていて、DjangoNinjaのどこがよい?(個人的な意見) シンプルかつ直感的で、読みやすい Python の型ヒントを利用して Web API のスキーマを定義でき、 バリデーションも実行できる 2 1 FastAPIに触れたことがある開発者はもちろん、触れたことがないユーザーでも Djangoの経験があれば、学習コストはほとんどないはず

Slide 34

Slide 34 text

Fast to learn, Fast to code, Fast to run !! 早く習得でき、早くコードが書けて、早く実行できる! まるで忍者のように!

Slide 35

Slide 35 text

最後にちょっと宣伝

Slide 36

Slide 36 text

ブース情報 27番のブースでお待ちしております!

Slide 37

Slide 37 text

Pycon登壇者情報 30min 11:10 Pythonの数学機能を学ぼう!
 その仕組みも学ぼう! 眞鍋秀悟 4F Track3 大島和樹 20F Track2 30min 16:20 DjangoとFastAPIによる実践認 証技術 2024年9月28日(土) PyconJP2024にRecustomerから4名のエンジニアが登壇します! 16:40 15min PythonのHTTPクライアント ツール徹底比較 佐藤樹 20F Track2 2024年9月27日(金) Django Ninjaで高速なAPI開発を実現す る:実践ガイドとベストプラクティス 15min 11:40 加藤雅也 20F Track2

Slide 38

Slide 38 text

カジュアル面談リンク We Are Hiring! 一緒に働くメンバーを募集しています!
 エントランスブックはこちらから CTOとカジュアル面談をしましょう!

Slide 39

Slide 39 text

ご清聴ありがとうございました