@ -6,7 +6,7 @@
## 「Dependency Injection」とは { #what -is-dependency-injection }
## 「Dependency Injection」とは { #what -is-dependency-injection }
**「Dependency Injection」** とは、プログラミングにおいて、コード(この場合は、*パスオペレーション 関数*)が動作したり使用したりするために必要なもの(「依存関係」)を宣言する方法があることを意味します:
**「Dependency Injection」** とは、プログラミングにおいて、コード(この場合は、*path operation 関数*)が動作したり使用したりするために必要なもの(「依存関係」)を宣言する方法があることを意味します:
そして、そのシステム(この場合は、**FastAPI**)は、必要な依存関係をコードに提供するために必要なことは何でも行います(依存関係を「注入」します)。
そして、そのシステム(この場合は、**FastAPI**)は、必要な依存関係をコードに提供するために必要なことは何でも行います(依存関係を「注入」します)。
@ -29,7 +29,7 @@
まずは依存関係に注目してみましょう。
まずは依存関係に注目してみましょう。
以下のように、*パスオペレーション 関数*と同じパラメータを全て取ることができる関数にすぎません:
以下のように、*path operation 関数*と同じパラメータを全て取ることができる関数にすぎません:
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[8:9] *}
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[8:9] *}
@ -37,9 +37,9 @@
**2行**。
**2行**。
そして、それはすべての*パスオペレーション 関数*が持っているのと同じ形と構造を持っています。
そして、それはすべての*path operation 関数*が持っているのと同じ形と構造を持っています。
「デコレータ」を含まない(`@app.get("/some-path")`を含まない)*パスオペレーション 関数*と考えることもできます。
「デコレータ」を含まない(`@app.get("/some-path")`を含まない)*path operation 関数*と考えることもできます。
そして何でも返すことができます。
そして何でも返すことができます。
@ -67,7 +67,7 @@ FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(
### 「dependant」での依存関係の宣言 { #declare -the-dependency-in-the-dependant }
### 「dependant」での依存関係の宣言 { #declare -the-dependency-in-the-dependant }
*パスオペレーション 関数*のパラメータに`Body`や`Query`などを使用するのと同じように、新しいパラメータに`Depends`を使用することができます:
*path operation 関数*のパラメータに`Body`や`Query`などを使用するのと同じように、新しいパラメータに`Depends`を使用することができます:
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[13,18] *}
{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[13,18] *}
@ -79,7 +79,7 @@ FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(
直接**呼び出しません**(末尾に括弧を付けません)。`Depends()` のパラメータとして渡すだけです。
直接**呼び出しません**(末尾に括弧を付けません)。`Depends()` のパラメータとして渡すだけです。
そして、その関数は、*パスオペレーション 関数*が行うのと同じ方法でパラメータを取ります。
そして、その関数は、*path operation 関数*が行うのと同じ方法でパラメータを取ります。
/// tip | 豆知識
/// tip | 豆知識
@ -91,7 +91,7 @@ FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(
* 依存関係("dependable")関数を正しいパラメータで呼び出します。
* 依存関係("dependable")関数を正しいパラメータで呼び出します。
* 関数の結果を取得します。
* 関数の結果を取得します。
* *パスオペレーション 関数*のパラメータにその結果を代入してください。
* *path operation 関数*のパラメータにその結果を代入してください。
```mermaid
```mermaid
graph TB
graph TB
@ -104,7 +104,7 @@ common_parameters --> read_items
common_parameters --> read_users
common_parameters --> read_users
```
```
この方法では、共有されるコードを一度書き、**FastAPI** が*パスオペレーション *のための呼び出しを行います。
この方法では、共有されるコードを一度書き、**FastAPI** が*path operation *のための呼び出しを行います。
/// check | 確認
/// check | 確認
@ -138,15 +138,15 @@ commons: Annotated[dict, Depends(common_parameters)]
依存関係は期待どおりに動作し続け、**一番良い点** は **型情報が保持される** ことです。つまり、エディタは **自動補完** 、**インラインエラー** などを提供し続けられます。`mypy` のような他のツールでも同様です。
依存関係は期待どおりに動作し続け、**一番良い点** は **型情報が保持される** ことです。つまり、エディタは **自動補完** 、**インラインエラー** などを提供し続けられます。`mypy` のような他のツールでも同様です。
これは **大規模なコードベース** で、**同じ依存関係** を **多くの *パスオペレーション ** * で何度も使う場合に特に役立ちます。
これは **大規模なコードベース** で、**同じ依存関係** を **多くの *path operation ** * で何度も使う場合に特に役立ちます。
## `async` にするかどうか { #to -async-or-not-to-async }
## `async` にするかどうか { #to -async-or-not-to-async }
依存関係は **FastAPI** (*パスオペレーション 関数*と同じ)からも呼び出されるため、関数を定義する際にも同じルールが適用されます。
依存関係は **FastAPI** (*path operation 関数*と同じ)からも呼び出されるため、関数を定義する際にも同じルールが適用されます。
`async def` や通常の`def`を使用することができます。
`async def` や通常の`def`を使用することができます。
また、通常の`def`*パスオペレーション関数*の中に`async def`を入れて依存関係を宣言したり、`async def`*パスオペレーション 関数*の中に`def`を入れて依存関係を宣言したりすることなどができます。
また、通常の`def`*path operation 関数*の中に`async def`を入れて依存関係を宣言したり、`async def`*path operation 関数*の中に`def`を入れて依存関係を宣言したりすることなどができます。
それは重要ではありません。**FastAPI** は何をすべきかを知っています。
それは重要ではありません。**FastAPI** は何をすべきかを知っています。
@ -166,13 +166,13 @@ commons: Annotated[dict, Depends(common_parameters)]
## 簡単な使い方 { #simple -usage }
## 簡単な使い方 { #simple -usage }
見てみると、*path*と*operation*が一致した時に*パスオペレーション 関数*が宣言されていて、**FastAPI** が正しいパラメータで関数を呼び出してリクエストからデータを抽出する処理をしています。
見てみると、*path*と*operation*が一致した時に*path operation 関数*が宣言されていて、**FastAPI** が正しいパラメータで関数を呼び出してリクエストからデータを抽出する処理をしています。
実は、すべての(あるいはほとんどの)Webフレームワークは、このように動作します。
実は、すべての(あるいはほとんどの)Webフレームワークは、このように動作します。
これらの関数を直接呼び出すことはありません。これらの関数はフレームワーク(この場合は、**FastAPI**)によって呼び出されます。
これらの関数を直接呼び出すことはありません。これらの関数はフレームワーク(この場合は、**FastAPI**)によって呼び出されます。
Dependency Injection システムでは、**FastAPI** に*パスオペレーション関数*もまた、*パスオペレーション 関数*の前に実行されるべき他の何かに「依存」していることを伝えることができ、**FastAPI** がそれを実行し、結果を「注入」することを引き受けます。
Dependency Injection システムでは、**FastAPI** に*path operation 関数*もまた、*path operation 関数*の前に実行されるべき他の何かに「依存」していることを伝えることができ、**FastAPI** がそれを実行し、結果を「注入」することを引き受けます。
他にも、「dependency injection」と同じような考えの一般的な用語があります:
他にも、「dependency injection」と同じような考えの一般的な用語があります:
@ -184,7 +184,7 @@ Dependency Injection システムでは、**FastAPI** に*パスオペレーシ
## **FastAPI** プラグイン { #fastapi -plug-ins }
## **FastAPI** プラグイン { #fastapi -plug-ins }
統合や「プラグイン」は **Dependency Injection** システムを使って構築することができます。しかし、実際には、**「プラグイン」を作成する必要はありません**。依存関係を使用することで、無限の数の統合やインタラクションを宣言することができ、それが*パスオペレーション 関数*で利用可能になるからです。
統合や「プラグイン」は **Dependency Injection** システムを使って構築することができます。しかし、実際には、**「プラグイン」を作成する必要はありません**。依存関係を使用することで、無限の数の統合やインタラクションを宣言することができ、それが*path operation 関数*で利用可能になるからです。
依存関係は非常にシンプルで直感的な方法で作成することができ、必要なPythonパッケージをインポートするだけで、*文字通り*数行のコードでAPI関数と統合することができます。
依存関係は非常にシンプルで直感的な方法で作成することができ、必要なPythonパッケージをインポートするだけで、*文字通り*数行のコードでAPI関数と統合することができます。
@ -211,7 +211,7 @@ dependency injection システムがシンプルなので、**FastAPI** は以
最終的には、依存関係の階層ツリーが構築され、**Dependency Injection**システムが、これらの依存関係(およびそのサブ依存関係)をすべて解決し、各ステップで結果を提供(注入)します。
最終的には、依存関係の階層ツリーが構築され、**Dependency Injection**システムが、これらの依存関係(およびそのサブ依存関係)をすべて解決し、各ステップで結果を提供(注入)します。
例えば、4つのAPIエンドポイント(*パスオペレーション *)があるとします:
例えば、4つのAPIエンドポイント(*path operation *)があるとします:
* `/items/public/`
* `/items/public/`
* `/items/private/`
* `/items/private/`
@ -245,6 +245,6 @@ paying_user --> pro_items
## **OpenAPI** との統合 { #integrated -with-openapi_1 }
## **OpenAPI** との統合 { #integrated -with-openapi_1 }
これら全ての依存関係は、要件を宣言すると同時に、*パスオペレーション *にパラメータやバリデーションを追加します。
これら全ての依存関係は、要件を宣言すると同時に、*path operation *にパラメータやバリデーションを追加します。
**FastAPI** はそれをすべてOpenAPIスキーマに追加して、対話型のドキュメントシステムに表示されるようにします。
**FastAPI** はそれをすべてOpenAPIスキーマに追加して、対話型のドキュメントシステムに表示されるようにします。