FastAPIのWebSocket:エンドポイント、配信、テスト

FastAPIのWebSocket

FastAPIのWebSocket:エンドポイント、配信マネージャー、テスト | We.Inc

FastAPIでWebSocketエンドポイントを書き、接続マネージャーで全クライアントに配信し、クエリのトークンを読み、切断を処理して、TestClientでまとめてテストする方法。

FastAPIでは、@app.websocket("/ws")と、WebSocketを受け取る非同期関数でソケットのルートを宣言します。await websocket.accept()を呼び出してから、receive_text()とsend_text()をループで回します。クライアントが離脱したときの後始末にはWebSocketDisconnectを捕捉します。最初にwebsocketsパッケージをインストールし、テストにはTestClient.websocket_connect()を使います。

よく呼び出すWebSocketのメソッド

下のエンドポイントビルダーは、いくつかの選択肢から動作するmain.pyを書き出します。ルートのパス、メッセージがプレーンテキストかJSONか、全クライアントが全メッセージを受け取るか、クエリ文字列でトークンを必須にするか、です。対応するpytestファイルも付いてきます。どのオプションもFastAPIのドキュメントにあるパターンに対応しており、ここでは実行可能な1つのファイルにまとめ直しています。

よくある質問

FastAPIのWebSocketが404を返したり、アップグレードに失敗したりするのはなぜですか?

まずインストールを確認しましょう。FastAPIのWebSocketのドキュメントでは、FastAPIに加えてwebsocketsパッケージを追加するよう求めています。次にパスを確認します。@app.websocketで宣言したルートはソケットのアップグレードにだけ応答し、通常のHTTPのGETには応答しないからです。accept()の前にソケットを閉じた場合も、ハンドシェイクの拒否(HTTP 403)として現れます。

すべてのクライアントにメッセージを配信するには?

受け入れたソケットを小さなマネージャークラス内のリストに保持し、接続時に追加、切断時に削除して、リストをループしながらsend_textを呼び出します。上のビルダーで配信オプションにチェックを入れると、まさにこのコードが生成されます。

複数のUvicornワーカーでも配信は機能しますか?

メモリ上のリストでは機能しません。各ワーカーは独自のリストを持つ別プロセスだからです。FastAPIのドキュメントはencode/broadcasterを紹介しています。これはRedisやPostgreSQLを介してメッセージを中継し、すべてのプロセスがすべてのメッセージを受け取れるようにします。

WebSocketのルートでDependsやQueryを使えますか?

使えます。WebSocketのエンドポイントはHTTPのルートと同じくDepends、Query、Cookie、Header、Path、Securityを受け付けるため、認証の依存関係を両方で共有できます。

WebSocketエンドポイントはどうテストしますか?

アプリのTestClientを作成し、withブロック内でclient.websocket_connect("/ws")を使ってソケットを開きます。その中でsend_textとreceive_textを使ってやり取りを進め、ブロックを抜けると接続が閉じます。

エンドポイントのループが行っていること

受け入れ前の認証

動作する最小のエンドポイント

main.py:エコー

受け入れた後、クライアントが切断するまで各メッセージをそのまま返します。

接続マネージャーで配信する

すべての接続で共有するマネージャークラス

単一プロセスで動作します。スケールアウトする前に、リストをRedisベースの中継に置き換えましょう。

TestClientでテストする

サーバーは不要です。クライアントがプロセス内でアプリと直接やり取りします。pytestで実行してください。

FastAPIのWebSocketエンドポイントビルダー

エンドポイントの動作を選び、完全なmain.pyと、それを検証するpytestファイルをコピーしましょう。

メッセージの形式

プレーンテキスト

JSON

すべてのメッセージを接続中の全クライアントに送る

クエリ文字列でトークンを必須にする(?token=...)

実行:fastapi dev main.py の後、ws://localhost:8000{v} に接続

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る