FastAPI で同じパス パラメーターを使用して複数の API エンドポイントを定義するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-10-30 17:08:02
オリジナル
410 人が閲覧しました

How to Define Multiple API Endpoints with the Same Path Parameter in FastAPI?

FastAPI で同じパス パラメータを持つ複数の API エンドポイントを定義する

FastAPI で、同じパス パラメータで異なる複数の API エンドポイントを定義する道は単純ではありません。エンドポイント評価の順序が重要であるため、リクエストの特定のパスに関係なく、最初に定義されたエンドポイントが常にトリガーされます。

問題

次のルーター ファイルについて考えてみましょう。ここで 3 つのエンドポイントが定義されており、それぞれ異なるパスを持ちますが、「project_id」パス パラメーターを共有しています:

</p>
<h1>GET API Endpoint 1</h1>
<p>@router.get("/project/{project_id}/{employee_id}")<br>async def method_one(project_id: str,organization_id: str, session: AsyncSession = depends(get_db)):</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"># ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

GET API エンドポイント 2

@router.get("/project/details/{project_id}")
async def method_two(project_id: str, session: AsyncSession = depends(get_db) )):

# ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

GET API エンドポイント 3

@router.get("/project/metadata/{project_id}")
async def method_three(project_id: str, session : AsyncSession = depends(get_db)):

# ...
ログイン後にコピー
ログイン後にコピー

このコードは、API エンドポイント 2 および 3 がエンドポイント 1 で定義されたコントローラー メソッド (method_one) を呼び出すときに予期しない動作を示します。 ()).

Reason

FastAPI では、エンドポイントの評価は順番に行われます。したがって、エンドポイント 1 (「/project/{project_id}/{employee_id}」) が最初に評価されます。後続のリクエストがエンドポイント 2 またはエンドポイント 3 に対して行われると、FastAPI はパスの「/project/{project_id}」部分をエンドポイント 1 の project_id パラメーターとして解釈します。これにより、エンドポイント 1 のコントローラー メソッドが呼び出されます。

解決策

この問題を解決するには、エンドポイント定義の順序を逆にして、同じパス パラメーターを持つエンドポイントが追加のパスを含むエンドポイントの前に定義されるようにする必要があります。パラメータ:

</p>
<h1>GET API エンドポイント 2</h1>
<p>@router.get("/project/details/{project_id} ")</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"># ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

GET API エンドポイント 3

@router.get("/project/metadata/{project_id}")

# ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

GET API エンドポイント 1

@router.get("/project/{project_id}/{employee_id}")

# ...
ログイン後にコピー
ログイン後にコピー

この変更を行うことで、FastAPIは最初にエンドポイント 2 と 3 を評価し、それらのエンドポイントにリクエストが行われたときに適切なコントローラー メソッドが実行されるようにします。

以上がFastAPI で同じパス パラメーターを使用して複数の API エンドポイントを定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:`list.__iadd__` は元のリストと割り当てられたリストの両方を変更するのに、`list.__add__` は割り当てられたリストのみを変更するのはなぜですか? 次の記事:Python で固定幅のファイル行を効率的に解析するにはどうすればよいですか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!