FastAPIのプラグインとTips
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
FastAPI-Login
Flask-Loginと同様のログイン認証機能をFastAPIに提供する
$ pip install fastapi-login
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
FastAPI Utilities
- プロジェクト間で共通の機能を再利用できる便利な多数のユーティリティ
- クラスベースビュー:関連するエンドポイントで同じ依存関係を重複定義をなくせる
- SQLAlchemyのセッション管理
FastAPI-Restful
- リソースクラス:REST APIを簡単に実装できる
- クラスベースビュー:関連するエンドポイントで同じ依存関係を重複定義をなくせる
- SQLAlchemyのセッション管理
主な使い方
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
FastAPI-Admin
FastAPIに管理画面ダッシュボードを提供
Tortoise ORM
によるCRUD操作APIを提供
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
FastAPI Users
FastAPIにJWT認証、Cookie認証を提供する。
Python3.7以降が必要。
- 拡張可能なユーザモデル
- ユーザ管理のCRUD操作APIを提供
- サポートしているORM:SQLAlchemy, MongoDB, Tortorise ORM
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
FastAPI-Security
FastAPIにさまざまな認証バックエンドをサポートさせることができる
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
FastAPI-Contrib
再利用可能な便利な多数のライブラリ
- MongoDBのサポート
- モデルシリアライザー
- 認証や権限の機能
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
FastAPI-Versioning
APIバージョンを柔軟に運用できるようになる
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
fastalchemy
FastAPIへSQLALchemy ORM をミドルウェアとして提供する。
とても簡単に記述できるれけど、モジュール構造や変数名に自由度がないのが欠点。
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
slowapi
Flask-Limitter と同様のユーザトラフィックを制限する機能をFastAPIに提供する
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
fastapi-plugins
FastAPIにRedisなどの外部ソフトウェアと連携するプラグインを提供する
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
バックグラウンド実行
FastAPIにはCeleryみたいな簡易的なバックグラウンド実行の機能がある
Celeryとの違い
- BackgroundTasks:FastAPIアプリとメモリや変数を共有する場合や、比較的軽量の処理を行う場合に有用
- Celery(など):メッセージキューを細かく管理したい場合や、比較的重い処理を行う場合に有用
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
ASGIサーバーの比較
- Uvicorn
- Hypercorn
- Daphne
Uvicorn
UvicornはFastAPIの公式サイトでも用いられている。
最もオーソドックスで使用率の高いサーバーでもある。
uvloopと呼ばれる超高速asyncioイベントループを用いることもでき高速に動作する。
wWebSocketとHTTP/1.1はサポートしているが、HTTP/2はまだサポートしていない。
Hypercorn
WSGIであるGunicornの影響を受けて開発されたASGIサーバー。
- HTTP/2
- ASGI/2
- ASGI/3
上記の仕様もサポートしている。
元々は、Quartと呼ばれる非同期PythonWebマイクロフレームワークの一部だったが、分離されて今は別のフレームワークでもASGIサーバーとして利用されている。
Daphne
![shimakaze_soft](https://res.cloudinary.com/zenn/image/fetch/s--hsbwYTN9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/96f9eb14ea.jpeg)
非同期処理周り
FastAPIは、defで作成されたpath関数は、自動的にマルチスレッド化されて平行処理
される。
asyncを使用するのであれば、そのpath関数から呼ばれる全ての処理をasync対応
にする必要がある。
それをしなければ、パフォーマンス上の問題が発生する可能性がある。
async defで作成された場合は、単一スレッド
として処理される。
全ての処理がasync対応されていれば単一スレッドでも、awaitのタイミングで逐次切り替えて平行処理が可能だが、ブロッキングとなるようなdef関数が間に入ると、awaitのような切り替え処理もされず、さらにマルチスレッドでもないので後続の処理が全てそこで待たされる
、という現象が発生する。
コンテナやDBのスペックも問題ないはずなのに、なぜかアクセスが遅くなる時がある
という場合は、この現象が起きている可能性がある。