Starlette: 軽量ASGIフレームワーク/ツールキット徹底解説 ✨

プログラミング

Pythonで高速な非同期Webサービスを構築するための強力な選択肢

Starletteは、Pythonで非同期Webサービスを構築するために理想的な、軽量なASGIフレームワーク/ツールキットです。ASGI (Asynchronous Server Gateway Interface) は、非同期Python Webサーバーとアプリケーション間の標準インターフェースであり、WSGI (Web Server Gateway Interface) の後継として設計されました。WSGIが同期処理を前提としていたのに対し、ASGIはasync/await構文をネイティブにサポートし、WebSocketやHTTP/2などのプロトコルも扱えるように設計されています。

StarletteはこのASGIの仕様に基づいて構築されており、非常に高いパフォーマンスを発揮します。TechEmpowerのベンチマークでは、Starletteは最も高速なPythonフレームワークの一つとして評価されています。また、Starletteはフレームワークとしてだけでなく、個々のコンポーネントを独立して利用できるツールキットとしての側面も持っています。このモジュール性により、他のASGIフレームワークとコンポーネント(ミドルウェアなど)を共有できるエコシステムの構築が促進されています。

Starletteは、非常に人気のあるAPIフレームワークであるFastAPIの基盤としても利用されています。FastAPIはStarletteの機能の上に、データ検証、シリアライゼーション、自動ドキュメント生成などのAPI開発に特化した機能を追加しています。

ポイント: Starletteは「軽量」「高速」「非同期」「モジュール性」がキーワードのASGIフレームワーク/ツールキットです。
Starletteは、軽量ながらもWebアプリケーション開発に必要な多くの機能を提供します。
  • Impressive Performance: ASGIとasync/awaitを活用し、非常に高いパフォーマンスを実現します。
  • WebSocket Support: WebSocketによるリアルタイム双方向通信をネイティブにサポートします。
  • GraphQL Support: GraphQL APIを構築するためのサポートも提供されています(例: Ariadne, Strawberryとの連携)。
  • In-process background tasks: リクエスト処理とは別に、バックグラウンドで非同期タスクを実行できます。
  • Startup and shutdown events: アプリケーションの起動時と終了時に実行されるイベント(ライフサイクルイベント)を定義できます。
  • Test client built on httpx: httpxをベースにしたテストクライアントが提供され、アプリケーションのテストが容易です。HTTPリクエストだけでなくWebSocketのテストも可能です。
  • CORS, GZip, Static Files, Streaming responses: CORS (Cross-Origin Resource Sharing) ヘッダーの制御、GZip圧縮、静的ファイルの配信、ストリーミングレスポンスなど、Web開発で一般的な機能が組み込まれています。
  • Session and Cookie support: セッション管理とクッキーのサポートが含まれています。
  • 100% test coverage: コードベースは100%のテストカバレッジを達成しており、信頼性が高いです。
  • 100% type annotated codebase: コードベースは完全に型ヒントが付与されており、静的解析ツールとの連携や開発効率の向上に寄与します。
  • Few hard dependencies: 必須の依存関係はanyioのみと非常に少なく、軽量です。その他の機能(テストクライアント、テンプレート、フォーム解析など)はオプションの依存関係となっています。
  • Framework or Toolkit: 完全なWebフレームワークとしても、個々のコンポーネントを利用するASGIツールキットとしても使用可能です。
  • Modularity: モジュール性が高く、再利用可能なコンポーネントを構築し、他のASGIフレームワークと共有することが推奨されています。

Starletteを使用するには、まずPython 3.8以上が必要です。インストールはpipを使用します。

pip install starlette

StarletteはASGIアプリケーションなので、実行するにはASGIサーバーが必要です。代表的なものにはuvicorn, daphne, hypercornなどがあります。ここでは、広く使われているuvicornをインストールします。

pip install uvicorn

もし、テストクライアント、Jinja2テンプレート、フォーム解析など、Starletteの全てのオプション機能を使いたい場合は、以下のようにインストールできます。

pip install "starlette[full]"

これにより、httpx, jinja2, python-multipart, itsdangerous, pyyamlといったオプションの依存関係が一緒にインストールされます。

簡単なStarletteアプリケーションを作成してみましょう。main.pyというファイル名で以下のコードを保存します。

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route

async def homepage(request):
    '''ホームページへのリクエストを処理する非同期関数'''
    return JSONResponse({'hello': 'world'})

# ルートを定義
routes = [
    Route("/", endpoint=homepage)
]

# Starletteアプリケーションインスタンスを作成
app = Starlette(debug=True, routes=routes)

このコードでは、まず必要なクラス(Starlette, JSONResponse, Route)をインポートしています。次に、ルートパス/へのリクエストを処理する非同期関数homepageを定義しています。この関数はJSONレスポンスを返します。そして、Routeクラスを使ってパスとエンドポイント関数を紐付け、routesリストを作成します。最後に、Starletteクラスのインスタンスを作成し、デバッグモードを有効にし、定義したルートを渡しています。

このアプリケーションを実行するには、ターミナルでuvicornを使用します。

uvicorn main:app --reload

main:appは、main.pyファイルの中のappという名前のASGIアプリケーションインスタンスを指定しています。--reloadオプションを付けると、コードの変更を検知してサーバーが自動的にリロードされるため、開発中に便利です。

実行後、Webブラウザで http://127.0.0.1:8000/ にアクセスすると、{"hello": "world"}というJSONが表示されるはずです。🎉

コメント

タイトルとURLをコピーしました