世界を動かす技術を、日本語で。

「Litestar」は一見の価値あり

概要

  • Litestar は、Pythonの非同期・型ヒント駆動Webフレームワークの中でも独自性を持つ存在
  • FastAPI など他の人気フレームワークと比較し、柔軟な設計や拡張性が特徴
  • ルーティングや依存性管理、スケーラビリティに優れたアーキテクチャを採用
  • Pydantic への依存度が低く、データスキーマ定義の柔軟性が高い
  • 大規模開発や複雑な要件にも対応できる設計思想

Litestar:Python Web開発の隠れた逸材

  • 数年前、職場のプロジェクトで Litestar を選択
    • FastAPI ほどの話題性はないが、堅実な選択肢
  • 以降18ヶ月間、全ての新規プロジェクトで Litestar を採用
  • PythonでWebアプリ開発を行うエンジニアでも、 Litestar を知らないケースが多い
  • シンプルなシングルファイルアプリの例
    • litestar importと@getデコレータで簡単にルーティング
    • litestar runやASGIサーバで即時動作

名前の由来と変遷

  • Litestar は元々「Starlite」という名前で開発
  • Starlette は非同期Python Web開発のためのツールキット
    • FastAPI も内部でStarletteを利用
  • LitestarはStarlette依存を廃止し、独自実装へ
  • 名前の混乱を避けるため、2023年に「Litestar」に改名

コードベースのスケーリング(拡張性)

  • 「スケーリング」はトラフィック対応だけでなく、 コードベースの拡張性 も重要
  • Django は小規模プロジェクトへの適用がやや不得手
    • 最初から多くのファイル・ディレクトリ構成が必要
  • マイクロフレームワーク は逆に、大規模化で構成が煩雑化しやすい
  • FastAPI/Flask/Quart のルーティングはアプリケーションオブジェクトへのデコレータ依存
    • 複数ファイル構成で循環インポート問題が発生
    • 解決策としてAPI RouterやBlueprintなどの仕組みが必要
  • Litestar はルートデコレータがスタンドアロン関数
    • 循環インポート問題を回避
    • ルートグループやレイヤードアーキテクチャを早期に導入可能
    • ルーターの構成例
      • 認証や依存性注入を柔軟に設定
      • CRUDエンドポイントの共通化や再利用が容易

柔軟なルート登録

  • 同じルートを異なる設定で複数回登録可能
    • 認証方式ごとの切り替え
    • 依存性の切り替え
  • FastAPIやFlaskでも一部実現可能だが、フレームワークと「戦う」必要がある

Pydanticへの依存度の違い

  • Pydantic は型アノテーション駆動のスキーマ定義・バリデーション用パッケージ
    • FastAPI はPydanticへの強い依存が特徴
    • SQLAlchemyなどORMとの直接連携が難しい
      • 同じデータ構造を複数回定義する必要
      • FastAPI作者は独自DBツールキットを開発
  • Litestar はPydanticに限定されず、柔軟なスキーマ定義が可能
    • デフォルトでPydantic・dataclasses・msgspecに対応
    • attrsやSQLAlchemy用プラグインを標準搭載
    • 独自シリアライザプラグインも容易に追加可能
  • データ転送オブジェクト(DTO)の自動派生機能
    • SQLAlchemyモデルからHTTPレスポンス用や更新用スキーマを自動生成
    • コードの重複や保守コストを大幅削減

まとめ:Litestarの魅力

  • 柔軟な設計拡張性 が最大の強み
  • 小規模から大規模まで、 シームレスなスケーリング が可能
  • Pydantic への過度な依存を避け、様々なデータ構造と連携
  • ドキュメントやアーキテクチャも一貫性・実用性を重視
  • Python Web開発の新たな選択肢として、 Litestar の導入価値

Hackerたちの意見

すごく良い投稿だね!実際のアプリケーションに役立つ重要な詳細に触れてる。Litestarのデザインが大好きなんだ。 > それに、リポジトリやサービスレイヤーの悪い使い方がたくさんあると思うから、みんな避けた方がいいよね。でも、それはちょっと脱線だから、別の投稿にした方がいいかも。リポジトリパターンの大ファンとして、この投稿を楽しみにしてるよ。

これはPythonのウェブフレームワークだよ。クリックする前にもっと知りたい人のために。

ありがとう、時間を節約できたよ。

これを書いてくれてありがとう。ここ数年FastAPIでアプリを開発してきて、似たような不満があるんだ。FastAPIのドキュメントが素晴らしいっていう態度がどれだけ一般的か、驚かされることが多いよ。チュートリアルやおもちゃの例が実際の開発やAPIの測定からどれだけ離れているかを考えるとね。

新しい世代のPythonフレームワークのドキュメントには本当にがっかりしてる。JavaScriptのライブラリと同じように「ドキュメントはチュートリアルとおしゃべりなブログ投稿で、APIを不正確に説明している」って感じ。二言で言うと、APIリファレンスが必要。メソッドの説明はクリアにして、パラメータが何をするのかをちゃんと分解してほしい。全部リストアップして、文章に囲まないで!パラメータに何を渡せるのかをソースコードを見て探さなきゃいけないのは本当に面倒。APIの使い方を知りたいと思ったら、「どのチュートリアルページがこのAPIを使ってるか」を探すゲームをしなきゃいけないのが、すごくストレス。

もう1年以上Litestarを使ってるけど、JSONとテンプレートHTMLの両方を提供してる。すごくバランスの取れたPythonの非同期フレームワークで、速さ(FastAPIより速い)や軽量さを保ちながら、認証やセッションなどの機能も十分に備えてる。msgspecのファーストクラスサポートと、ネストされたルーティング用のControllerクラスが気に入ってる。めっちゃおすすめだよ。

確かにチェックする価値がありそうだね。FastAPIを数年使ってるよ。

これを書いてくれてありがとう。ここ1年ほどFastAPIで大きなバックエンドを構築していて、いろんな苦労を経験したよ。最初は標準の「チュートリアル」スタイルを使ってたけど、公式テンプレートがCRUD操作を全部1つのファイルにまとめてるのを見たときは、ちょっと引いたね(前にRailsやSpringをやってたから)。依存関係の管理の仕方も…正直、あまり快適じゃなかったよ。それからSQLModelの問題が出てきた。著者はFastAPIのドキュメントでそれを強く推してるけど(正直、ドキュメントはひどいと思う。ドキュメントを探してるときは、ドキュメントが欲しいんだ、派手なチュートリアルじゃなくて)、ORMとして(はい、SQLAlchemyの上にあるレイヤーだって知ってるけど)ポリモーフィックモデルもサポートしてないし、コミュニティからのPRも何ヶ月もレビューなしで放置されてることがある(もうメンテされてるのかも分からない)。大きなプロジェクトを作るためにFastAPIを選んだのは自分の責任だと思うけど、かなり使った後(コードも読んだし、再度言うけどドキュメントが極めて貧弱だから)真剣なプロジェクトにはおすすめしないよ。確かに、クイックなCRUDを作りたいならSQLModelとFastAPIを使ってもいいけど、複雑なアプリケーションには向いてないからね(少なくとも、俺が不幸にもやったように、上にフレームワークを書く必要がある)。だから、この投稿の著者には大感謝!明日目が覚めたらLitestarに移行するつもりだよ。

編集:Litestarのドキュメントを読んでたら、内蔵のイベントシステムまであるんだ!FastAPIで使える何かを作るのに数週間かけたのに…

正直、FastAPIの「ドキュメント」はここにあるよ:https://github.com/polarsource/polar/tree/main/server 大きめのアプリでFastAPIをスケールさせる方法を知りたいなら、認証やテストなど、現代的なプラクティスを含めて、「そのリポジトリでどうやってるか」を見るのがいいスタートだと思う。

それからSQLModelの問題が出てきた。著者はFastAPIのドキュメントでこれをかなり強く推してる。 いや、そうじゃないよ?FastAPIのトップページにはSQLModelについての言及がないかなり長いチュートリアルがある。SQLModelが重要に言及されるのは、リレーショナルDBを接続するページだけど、どんなDBでも使えるって明確に書いてある。チュートリアル用に何かを選ばなきゃいけないから、著者が自分のを選ぶのは理解できる。もしSQLModelが合わないなら、あなたが悪いだけだよ。前にそのチュートリアルをやって、普通のSQLAlchemyに落ち着いた。

Litestarもこれに悩まされてるんじゃない?コミュニティの採用率やドキュメント、議論が少ない中で、LitestarはFastAPIよりも複雑なアプリケーションを作るのに向いてると思う?

APIスタイルのアプリを始めたばかりなんだ。この投稿は、考えたことのなかったいくつかのアーキテクチャやツールのポイントをカバーしていて素晴らしかった。今はLiteStarを使おうと思ってる。いいコメントありがとう、著者への感謝も同感だよ。

FastAPIが注目されてるのは分かるけど、普通のStarletteも結構使えるよ。確かに全部の機能が揃ってるわけじゃないけど、小さくてシンプルなものが必要なら、十分に役立つ。比較すると、LitestarはFastAPIやDjangoに近い感じがする。

同じく、最近作ったAPIは全部Starletteだけで構築したんだけど、めっちゃ良いと思う。クリーンで、簡潔で、ドキュメントもちゃんとしてるし、必要に応じて拡張もできるから、小さいプロジェクトから大きいプロジェクトまで対応できるよ。

LitestarはAPIバックエンドを作るのに素晴らしいと思う。大好きだし、使ってるし、いいことしか言えない。Advanced Alchemyも順調に進んでるみたい。もちろん、Litestarは昔ながらのサーバーでテンプレートをレンダリングするサイトもサポートしてるし、HTMXのリクエストとレスポンス用のプラグインもある。実際、APIエンドポイントにうまく対応するパターンが、昔ながらの「フォームを検証してリダイレクト、またはエラーで再レンダリング」するエンドポイントの邪魔になることがある。特に、Litestarには「本当の」フォームサポートがないから、検証はAPIコールのスキーマミスマッチをフラグするためのもので、複数の個別エラーフィールドをフラグするためのものじゃない。@post("/route", exception_handlers={...})を使うのは、これらのエンドポイントにはちょっと不便だね。もっと良いツールやDXがあれば嬉しいな。

いいまとめだね!Litestarのことはたまに聞くけど、まだ試したことはない。試してみるべきかな。ここ数年、FastAPIをかなり使ってきたけど、OPの言ってる「大きなコードベースでFastAPIが使いにくい」ってのは誇張されてると思う。ルートを複数のファイルに分けて、それぞれにルートオブジェクトを持たせて、インポートして大きな階層を作るのはそんなに難しくないし、ちゃんと機能してる。確かに、大きなFastAPIのコードベースをどう構造化するかについては、十分なドキュメントがないかもしれないけど、ベストプラクティスと自分の好みを混ぜて、モジュールに分けて、定数やエラー、ルート、スキーマ、CRUDなどの特定のファイルに分ければ、ちゃんとスケールできるよ。FastAPIでSQLAlchemyを使ったことはないけど、仕事ではそれが意味をなさないデータストアに接続してるから、もしかしたら偏見があるかも。

Connexionも一度見てみる価値あると思う。スペックファースト開発を採用してるから、大きな組織や公開APIにとっては大きなメリットだし、いろんなサーバーフレームワークに接続できるよ。(昔はメンテナーだったけど、もう何年も触ってないな。)

だから、Pythonでデータベースを使ったウェブアプリを作るなら、Djangoを使わない限り、ほぼ確実にSQLAlchemyを使うことになるよ。自分はSQLAlchemyよりDjangoのORMの方が好きだけど、他の人はどう思ってるのか気になるな。ウェブ以外のプロジェクトでもDjangoのORMを使ったことがあるけど、ちょっと手間がかかるんだよね。もしDjangoのORMがもっとスタンドアロンで使いやすかったら、もっと多くの人が使うと思う。