🚀

要点がギュっと詰まった「FastAPI入門」を読みながらTODOアプリを作った

2023/05/14に公開

FastAPIに入門すべく「FastAPI入門」を写経したのでレポートします。

はじめに

FastAPIとは

FastAPI は、Pythonの標準である型ヒントに基づいてPython 3.6 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。

https://fastapi.tiangolo.com/

FastAPI入門とは

FastAPI入門は、その名の通り、FastAPIの入門としてZennで公開されている本です。

DjangoやFlaskを使っている方にもおすすめ、最近人気のPython製高速Webフレームワーク、FastAPIの入門書です。

https://zenn.dev/sh0nk/books/537bb028709ab9

具体的にはTODOアプリを作ります。APIとしては7本、データストアにはMySQLを使います。
実際に手を動かす時間としてはトータル3時間ぐらいでした。


自動生成されたAPIドキュメント (詳細は後述)

うれしかったポイント (FastAPI)

実装をもとにAPIドキュメントが自動生成される

https://fastapi.tiangolo.com/features/#automatic-docs

まず感動したのがこれ。ぱっと思いつくだけでも以下のメリットがあります。

  • 実装とドキュメントが一致し続ける
    • アップデートも容易
  • 作業工数削減

中でも実装とドキュメントが一致し続けるはとても強力だと感じました。
どれだけ注意を払っていても、ドキュメントの修正漏れ等でドキュメントと実装の乖離を100%防ぐことはできないと思っています (特に長期のプロジェクトでは)。
そうなってしまうとドキュメントと実装どっちが正しいの?という問題が生じます。この機能あれば少なくともドキュメントは実装を反映しているので、そのような問題が生じることはありません。

型の強い恩恵

https://fastapi.tiangolo.com/features/#validation

Pythonにも型ヒントは存在しますが、あくまでヒントであり、実行には影響を与えません。
FastAPIでは、依存するライブラリPydanticによって、型ヒントを基にAPIの入出力のバリデーションを行います。
またシリアライゼーションとデシリアライゼーションによって、PythonオブジェクトとJSONの変換も簡単に行えます。

これによって入出力を安定し予期せぬ問題を防ぐことができます。またデータの取り回しも行いやすくなります。

うれしかったポイント (FastAPI入門)

Dockerで環境構築

この手のハンズオン、環境構築にハマって途中でやめた経験のある方も多いのではないでしょうか?FastAPI入門ではDockerで環境構築を行うため、簡単、かつ、原理的には環境差分が発生しません。
また、やろうと思えばコンテナ系のマネージドサービスに乗せられるのもうれしいところです。

非同期処理のコードと解説がある

非同期処理は、適切に活用することでパフォーマンスの向上やリソースの効率的な使用に寄与します。FastAPIは、非同期フレームワークであるStarletteを基盤にしているため、この非同期処理をサポートしています。
現状Pythonにおける非同期処理の解説はまだ少なく、実際に動くコードと解説は参考になりました。

テストまでカバーされている

FastAPI入門ではきっちりテストも書きます。テストの概念の説明ではなく、具体的な実装でどう書くかという情報は貴重だと思います。
例えば、DB周りが非同期の実装なので、テストも非同期に対応する必要がありますが、その具体的な実装方法が示されているのが非常に助かります。また、DIでDBの向き先をテスト用に切り替える部分も参考になりました。

ハマったところ

2つあります。どちらも読者コミュニティで取り上げられていました。

テストに失敗する

具体的には13章のテストを書く (2)で実装する完了フラグのテストです。
pytest-asyncioの挙動がバージョンによって異なることが原因です。私の環境では0.21.0だったために遭遇しました。コミュニティにあるようにテスト実行のコマンドを修正して対応しました。

https://zenn.dev/link/comments/f182253d10d867

ホットリロードが効かない

FastAPIはホットリロードに対応していますが、私の環境では部分的にしか効きませんでした。
具体的にはローカル側からファイルを修正してもホットリロードされず、コンテナの中に入って直接ファイルを作ると効くという状態です。
おそらくはファイルの変更通知がコンテナに伝わらないという問題だと思います。Docker Desktopではなく、Rancher Desktopを使っていることもあり、深追いはやめました。

https://zenn.dev/link/comments/cd4ca35103d30a

おわりに

モダンなPythonはこんな風なのだなと学びになりました(Pythonを書いていて、なんとかできないか?と感じる部分が結構解消されていた)。
このエントリを書きながら、公式ドキュメントを眺めていたのですが、そちらも充実していたので他にも色々と試してみたいと思います。

Discussion