「Django + Django REST frameworkでできるアレはFastAPIではどうするのか?」について調べた結果のメモ


FastAPIの勉強がてら調べてみました。

Django + Django REST framework(以下、DRF)でAPIサーバーを作るための知識を持っているのが前提の記事です。

FastAPIについて体系的な知識を求めているなら以下公式ドキュメントを読んでください。

FastAPI

Q. DRFのSerializers的な機能はある?

A. pydanticBaseModelを継承したクラスをパラメータ・戻り値にすることで入力・出力の型を指定できる。

参考URL: リクエストボディ - FastAPI

Q. DRFのParsers的な機能はある?

A. パラメータにFormFileを指定することでリクエストのフォーマットを変更することができる。(デフォルトはJSON)

参考URL:

Q. DRFのRenderers的な機能はある?

A. response_classパラメータに指定するクラスがそれに該当する。

参考URL: カスタムレスポンス - HTML、ストリーム、ファイル、その他のレスポンス - FastAPI

Q. DjangoのMiddleware的な機能はある?

A. FastAPIにも同様の機能がある(名前も同じくMiddleware)。

参考URL:

Q. 認証はどうやって実装する?

A. OAuth2かBasic認証で認証できる。

OAuth2で実装する場合の参考URL:

Basic認証で実装する場合の参考URL:

Q. DRFのPermissions的な機能はある?

A. 標準機能でそれらしいのはなかった。Dependenciesを使って自前で実装するか、以下のサードパーティライブラリを利用するとよさそう。

Q. データベース接続はどうする?

A. FastAPI自体にO/Rマッパーは内蔵されていないので、サードパーティのものと組み合わせて使うことになる。

参考URL: SQL (Relational) Databases - FastAPI

Q. Celery連携はできる?

A. できる。tiangolo/full-stack-fastapi-postgresqlというcookiecutter用テンプレート使って作ったプロジェクトの以下ファイルが参考になる。

  • backend/app/app/api/api_v1/endpoints/utils.py
  • backend/app/app/worker.py
  • backend/app/app/core/celery_app.py
  • backend/app/app/celeryworker_pre_start.py
  • backend/app/worker-start.sh
  • backend/celeryworker.dockerfile

Q. Django admin的な機能はないの?

A. FastAPI自体にはない。fastapi-adminというサードパーティライブラリを使えばできそう。(ただし、これはtortoise-orm専用)

SQLAlchemyを使うならFlask-Adminで別アプリケーションとしてAdminを構築して、以下ドキュメントの方法でFastAPIに組み込んでもいいかも。

参考URL: Including WSGI - Flask, Django, others - FastAPI

Q. 実際にAPIサーバーを実装する場合にファイル1個だけでは済まないはずだけど、ディレクトリ構成のベストプラクティスはあるの?

A. 以下ドキュメントが参考になる。

参考URL: Bigger Applications - Multiple Files - FastAPI

上記ドキュメントとは違うやり方だが、dispatchというNetflix製OSSも参考になる。(こちらはDjango風の設計になっているように見える)

Q. テストはどうやって書く?

A. テスト用のAPIが用意されている。公式ドキュメントの例に従ってpytestを使ったほうがよさそう。

参考URL:

Q. Sentryは使える?

A. 専用のMiddlewareが用意されている。

参考URL: Advanced Middleware - FastAPI の「Other middlewares」

loggingモジュール経由のエラーログをSentryに送りたいならLogging | Sentry Documentationを参考にすると良い。

Q. Djangoテンプレートのurlタグ的な機能はある?

A. url_for()がそれに該当する。

参考URL: Templates - FastAPI の「Templates and static files」

Q. Djangoのreverse的な機能はある?

A. FastAPIの公式ドキュメントに記載はなかったが、ベースになっているStarletteというフレームワークの公式ドキュメントによると、request.url_forapp.url_path_forを使えばよさそう。

参考URL: Routing - Starlette


comments powered by Disqus