Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DjangoNinjaで高速なAPI開発を実現する
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Masaya
September 27, 2024
Programming
1.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DjangoNinjaで高速なAPI開発を実現する
Masaya
September 27, 2024
More Decks by Masaya
See All by Masaya
raiseをやめて得たもの、失ったもの
masaya00
1
190
Pythonで実現する堅牢なシステム設計 〜イミュータブルがもたらす恩恵〜
masaya00
2
580
Other Decks in Programming
See All in Programming
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
typoなんかねぇよ
raspython3
0
660
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
4
2.8k
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
160
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
360
Press start. Python's next generation.
willingc
PRO
3
310
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
150
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
110
初めての模倣学習とVLA
natsutan
0
480
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
450
高専、大学編入、そして未踏へ〜プロダクト開発とキャリアの歩み - Technical College, University Transfer, and On to “Mitou” / My Journey in Product Development and Career
pkmiya
0
140
Featured
See All Featured
Speed Design
sergeychernyshev
33
2.1k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Docker and Python
trallard
47
4.2k
Ruling the World: When Life Gets Gamed
codingconduct
0
320
We Have a Design System, Now What?
morganepeng
55
8.3k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
510
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
What's in a price? How to price your products and services
michaelherold
247
13k
Transcript
本セッションのQRコード セッションスライド セッション途中で使用するコード(GitHub)
Django Ninjaで高速なAPI開発を実現する 実践ガイドとベストプラクティス
自己紹介 氏名 加藤 雅也 @mmmm70641 経歴 2021/04 ~ 2024/03 新卒で受託開発企業
2024/04 ~ Recustomer株式会社 普段はバックエンドとフロントエンドと開発に従事
本セッションについて
このセッションについて 対象 既存のDjangoプロジェクトにAPIを追加したいと思っている人 既存のDjangoプロジェクトでAPI開発をしている人 目標 DjangoNinjaというライブラリについての知見を得てもらい、今後Djangoプロジェクトに APIを追加したいとなった時の選択肢の一つになってほしい 話さないこと Djangoについて REST
APIについて
目次 DjangoNinjaとは 2 DjangoNinjaの特徴 3 実際のコードを見てみよう 4 最後に 1
Django Ninjaとは
Django Ninjaとは Djangoのエコシステムを活用しつつ、 FastAPIライクなAPIを構築することができるWebフレームワーク Django と組み合わせて使う、コントローラー層をサポートしてくれるライブラリ リクエストのルーティングや入出力のスキーマの定義が簡単にできる
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/)より参照
Django Ninjaの特徴 シンプルな設計と高速 なパフォーマンス Pydanticと非同期サポートにより、非 常に高いパフォーマンスを実現しま す。 型ヒント対応による 自動バリデーションと ドキュメント生成
型ヒントと自動ドキュメントにより、 ビジネス ロジックのみに集中できま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。
Django Ninjaの特徴 シンプルな設計と 高速なパフォーマンス Pydanticと非同期サポートにより、 非常に高いパフォーマンスを実現しま す。 型ヒント対応による 自動バリデーションと ドキュメント生成
型ヒントと自動ドキュメントにより、 ビジネス ロジックのみに集中できま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。
シンプルな設計と高速なパフォーマンス 使いやすく直感的に操作できる 2 非同期ビューを最大限に活用した高速なパフォーマンスを実現 1
使いやすく直感的に操作できる FastAPI 1 from fastapi import FastAPI 2 3 api
= FastAPI() 4 5 @api.get("/users/", response_model=list[Hoge]) 6 def get_users(): 7 """ユーザーのリストを取得します""" 8 ... DjangoRestFramework 1 from rest_framework.views import APIView 2 3 class UserListAPIView(APIView): 4 """ユーザーのリストを取得します""" 5 def get(self, request): 6 ... 7
使いやすく直感的に操作できる DjangoNinja 1 from ninja import NinjaAPI 2 3 api
= NinjaAPI() 4 5 @api.get("/users/", response=UserOut) 6 def get_users(request): 7 """ユーザーのリストを取得します""" 8 ... 9 10 @api.get("/users/{user_id}/", response=UserOut) 11 def get_user(request, user_id: int): 12 """特定のユーザーを取得します""" 13 ... 14 15 @api.post("/users/{user_id}/", response=UserOut) 16 def create_user(request, data: UserIn): 17 """新しいユーザーを作成します""" 18 ...
使いやすく直感的に操作できる DjangoNinja 1 from ninja import NinjaAPI 2 3 api
= NinjaAPI() 4 5 @api.get("/users/", response=UserOut) 6 def get_users(request): 7 """ユーザーのリストを取得します""" 8 ... FastAPI 1 from fastapi import FastAPI 2 3 api = FastAPI() 4 5 @api.get("/users/", response_model=list[Hoge]) 6 def get_users(): 7 """ユーザーのリストを取得します""" 8 ...
高速なパフォーマンス 「1つのリクエストのみ処理する」という条件の場合 Django Ninja → 約750リクエスト/秒 Flask + Marshmallow →
約750リクエスト/秒 Django REST Framework → 約500リクエスト/秒 DjangoNinja Flask + Marshmallow Django REST Framework DjangoNinja公式ドキュメント(https://django-ninja.dev/guides/async-support/)から参照
高速なパフォーマンス DjangoNinjaの非同期ビューを使用し、並列処理で50のリクエストを処理しながら、 遅いネットワーク操作を呼び出す場合の、1秒あたりのリクエスト数を測定しています。 グラフは、使用するワーカーの数(1から24まで)による性能の違いを示しています。 DjangoNinja Flask + Marshmallow Django REST
Framework DjangoNinja公式ドキュメント(https://django-ninja.dev/guides/async-support/)から参照
非同期ビューを最大限に活用した高速なパフォーマンスを実現 同期処理 1 import time 2 3 # 指定された秒数だけスリープして単語を返す処理 4
@api.get("/say-after") 5 def say_after(request, delay: int, word: str): time.sleep(dalay) 6 7 return {"saying": word} 8 非同期処理 1 import asyncio 2 3 # 指定された秒数だけスリープして単語を返す処理 4 @api.get("/say-after") 5 async def say_after(request, delay: int, word: str): 6 await asyncio.sleep(dalay) 7 return {"saying": word} 8
Django Ninjaの特徴 高速なパフォーマンス Pydanticと非同期サポートにより、 非常に高いパフォーマンスを実現しま す。 型ヒント対応による 自動バリデーションと ドキュメント生成 型ヒントと自動ドキュメントにより、
ビジネス ロジックのみに集中できま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。
型ヒント対応による自動バリデーションとドキュメント作成 Pydanticを利用した型定義ができる 2 SwaggerUIを使ったドキュメントが自動生成される 1
Pydanticを利用した型定義ができる Pydanticとは pythonの標準的な型ヒントを利用して、入力データが期待される型に従っているかを自動的にチェックするライブラリ 1 from pydantic import BaseModel 2 3
class User(BaseModel): 4 id: int 5 name: str 6 7 # データのインスタンス化 8 user = User(id=1, name="hoge") 9 print(user.id) # 1 10 print(user.name) # hoge 11 12 # 型が合わない場合 13 user = User(id="not number", name="hoge") 14 # -> ValidationError: id should be an integer
Pydanticを利用した型定義ができる 1 # SchemaはpydanticのBaseModelを継承している 2 from ninja import Schema 3
4 # 禁止ワード 5 forbidden_words: list[str] = ["aaa", "iii", "uuu"] 6 7 class UserIn(Schema): username: str 8 password: str 9 10 11 # 禁止ワードがパスワードに含まれているかどうかのバリデーション 12 @validator('password') 13 def forbidden_words(cls, value): 14 for forbidden_word in forbidden_words: 15 if forbidden_word in value: 16 raise ValueError(f"Password must not contain: {forbidden}") 17 return value 18 19 @api.post("/users/") 20 def create_user(request, data: UserIn): 21 user = User(username=data.username) 22 user.set_password(data.password) 23 # ...
SwaggerUIで生成されたAPIドキュメントが自動生成される
Django Ninjaの特徴 高速なパフォーマンス Pydanticと非同期サポートにより、 非常に高いパフォーマンスを実現しま す。 型ヒント対応による 自動バリデーションと ドキュメント生成 型ヒントと自動ドキュメントにより、
ビジネス ロジックのみに集中できま す。 Djangoとのシームレス な統合 Djangoの機能やエコシステム (Django ORMなど)と深く統合され ています。
Djangoとのシームレスの統合 DjangoORMとのシームレスな統合 2 Djangoミドルウェアや認証システムとの互換性 1
DjangoORMとのシームレスな統合 DjangoのORMをそのまま活用できるため、既存のモデルやデータベースとのやり取りがスムーズ DjangoのQuerySetやモデルインスタンスをそのまま返すことができるため、既存のDjangoアプリ ケーションのロジックを再利用しつつ、APIを簡単に作成できる 1 from django.shortcuts import get_object_or_404 2
from .models import Blog 3 from ninja import Schema 4 5 class BlogOut(Schema): 6 id: int 7 title: str 8 9 @api.get("/blog/{id}", response=BlogOut) 10 def get_blog(request, id: int): 11 """新しいユーザーを作成します""" 12 blog: Blog = get_object_or_404(Blog, id=id) 13 return blog 14
Djangoミドルウェアや認証システムとの互換性 DjangoNinjaはDjangoのミドルウェアや認証システムと完全に互換性があり、 例えば、既存の認証機構(DjangoのUserモデルやdjango.contrib.auth)を再利用して、APIに対して 簡単に認証・認可を導入できる 1 from ninja.security import django_auth 2
3 @api.get("/secure-data", auth=django_auth) 4 def secure_endpoint(request): 5 user = request.auth 6 ... 7 Djangoのカスタムミドルウェアもそのまま利用できるため、プロジェクトに既に導入済みのセキュ リティ、ログ、トランザクション管理などの仕組みをAPIに拡張することが可能
ここまでのまとめ 特徴 Django Ninja 型ヒント対応による 自動バリデーションと ドキュメント生成 Pydanticを利用した容易なバ Pydanticを利用した容易なバ 独自のバリデーションクラス
リデーション リデーション を利用するのが一般的 Djangoとのシームレスな統合 シームレスな統合が可能 シンプルな設計と 高速なパフォーマンス FastAPI REST Framework Djangoの機能を活かしつ 型ヒントを活用した直感的な Djangoの機能を活かしなが つ、型ヒントを活用した直感 開発 らAPIを構築するため 的な開発 Djangoとの統合が難しい シームレスな統合が可能
なぜRecustomerでDjangoNinjaを採用したか Djangoで積み上げてきたものを生かしつつ、高速なAPI開発を実現したかったから DjangoRestFrameworkなども候補にあったが、将来的にスピードの要件は必須に なることは目に見えていたため、DjangoNinjaを採用した
プロダクト 購入体験プラットフォーム Recustomer 返品キャンセル 返品キャンセルのCSおよび 倉庫業務を自動化 配送追跡 購入後の配送追跡から 新たな顧客接点を創り出す お届け日時
3月16日(水) 配達完了 配送状況 受取り日時を変更 配送業者 ヤマト運輸 追跡番号:12345678900 3月29日 配達完了 07:27 am 日本, 東京都港区 もっと見る 返品をしたい場合はこちら
簡単なシステム構成図 認証 バックエンド 返品/キャンセル FastAPI Django フロントエンド React Next.js Django
Ninja 配送追跡 Django Django Ninja 注文管理 エンドユーザー Django Django Ninja 大量の注文 ECストア
実際にどのように運用しているか https://github.com/Masaya00/pycon2024 ここからはVSCodeで https://github.com/Masaya00/pycon2024
実際に実務で使っていて、 DjangoNinjaのどこがよい?
実際に実務で使っていて、DjangoNinjaのどこがよい?(個人的な意見) 1 シンプルかつ直感的で、読みやすい FastAPIに触れたことがある開発者はもちろん、触れたことがないユーザーでも Djangoの経験があれば、学習コストはほとんどないはず 2 Python の型ヒントを利用して Web API
のスキーマを定義でき、 バリデーションも実行できる
Fast to learn, Fast to code, Fast to run !!
早く習得でき、早くコードが書けて、早く実行できる! まるで忍者のように!
最後にちょっと宣伝
ブース情報 27番のブースでお待ちしております!
Pycon登壇者情報 PyconJP2024にRecustomerから4名のエンジニアが登壇します! 2024年9月27日(金) 11:40 15min Django Ninjaで高速なAPI開発を実現す る:実践ガイドとベストプラクティス 加藤雅也 20F
Track2 16:40 PythonのHTTPクライアント ツール徹底比較 15min 佐藤樹 20F Track2 2024年9月28日(土) 11:10 Pythonの数学機能を学ぼう! その仕組みも学ぼう! 16:20 DjangoとFastAPIによる実践認 証技術 30min 30min 眞鍋秀悟 4F Track3 大島和樹 20F Track2
カジュアル面談リンク We Are Hiring! 一緒に働くメンバーを募集しています! エントランスブックはこちらから CTOとカジュアル面談をしましょう!
ご清聴ありがとうございました