# LLM テストファイル { #llm-test-file }
+
このドキュメントは、ドキュメントを翻訳する <abbr title="Large Language Model - 大規模言語モデル">LLM</abbr> が、`scripts/translate.py` の `general_prompt` と、`docs/{language code}/llm-prompt.md` の言語固有プロンプトを理解しているかをテストします。言語固有プロンプトは `general_prompt` の末尾に追加されます。
ここに追加したテストは、すべての言語固有プロンプトの設計者が参照します。
{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
-/// warning
+/// warning | 注意
上の例のように `Response` を直接返すと、それはそのまま返されます。
ただし、その固定の内容はパラメータ化できるようにしたいです。
-## "callable" なインスタンス { #a-callable-instance }
+## 「callable」なインスタンス { #a-callable-instance }
-Python には、クラスのインスタンスを "callable" にする方法があります。
+Python には、クラスのインスタンスを「callable」にする方法があります。
クラス自体(これはすでに callable です)ではなく、そのクラスのインスタンスです。
FastAPI 0.106.0 より前では、`yield` の後で例外を送出することはできませんでした。`yield` を持つ依存関係の終了コードはレスポンス送信「後」に実行されるため、[例外ハンドラ](../tutorial/handling-errors.md#install-custom-exception-handlers)はすでに実行済みでした。
-これは主に、依存関係が "yield" した同じオブジェクトをバックグラウンドタスク内で利用できるようにするための設計でした。終了コードはバックグラウンドタスク完了後に実行されるからです。
+これは主に、依存関係が「yield」した同じオブジェクトをバックグラウンドタスク内で利用できるようにするための設計でした。終了コードはバックグラウンドタスク完了後に実行されるからです。
これは、レスポンスがネットワーク上を移動するのを待っている間にリソースを保持しないようにする意図で、FastAPI 0.106.0 で変更されました。
いつもどおり、FastAPI では必要に応じて `def` と `async def` を組み合わせられます。
- どちらをいつ使うかの復習が必要な場合は、[`async` と `await`](../async.md#in-a-hurry) に関するドキュメントの _"In a hurry?"_ セクションを参照してください。
+ どちらをいつ使うかの復習が必要な場合は、[`async` と `await`](../async.md#in-a-hurry) に関するドキュメントの _「急いでいますか?」_ セクションを参照してください。
9. この *path operation 関数* は(可能ではありますが)dataclass 自体は返さず、内部データを持つ辞書のリストを返しています。
`dataclasses` は他の型注釈と多様な組み合わせが可能で、複雑なデータ構造を構成できます。
-ä¸\8aè¨\98ã\81®ã\82³ã\83¼ã\83\89å\86\85ã\82³ã\83¡ã\83³ã\83\88ã\81®ã\83\92ã\83³ã\83\88ã\82\92å\8f\82ç\85§ã\81\97ã\81¦ã\80\81ã\82\88ã\82\8aå\85·ä½\93ç\9a\84ã\81ªè©³ç´°ã\82\92確èª\8dã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82
+ä¸\8aè¨\98ã\81®ã\82³ã\83¼ã\83\89å\86\85ã\81®æ³¨é\87\88ã\81®ã\83\92ã\83³ã\83\88ã\82\92å\8f\82ç\85§ã\81\97ã\81¦ã\80\81ã\82\88ã\82\8aå\85·ä½\93ç\9a\84ã\81ªè©³ç´°ã\82\92確èª\8dã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82
## さらに学ぶ { #learn-more }
ここでは、`shutdown` のイベントハンドラ関数が、テキスト行 `"Application shutdown"` をファイル `log.txt` に書き込みます。
-/// note | 情報
+/// note | 備考
`open()` 関数の `mode="a"` は「追加」(append)を意味します。つまり、そのファイルに既にある内容を上書きせず、行が後ろに追記されます。
### `startup` と `shutdown` をまとめて { #startup-and-shutdown-together }
-起動時とシャットダウン時のロジックは関連していることが多いです。何かを開始してから終了したい、リソースを獲得してから解放したい、などです.
+起動時とシャットダウン時のロジックは関連していることが多いです。何かを開始してから終了したい、リソースを獲得してから解放したい、などです。
共有するロジックや変数のない別々の関数でそれを行うのは難しく、グローバル変数などに値を保存する必要が出てきます。
内部的には、ASGI の技術仕様において、これは [Lifespan プロトコル](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) の一部であり、`startup` と `shutdown` というイベントが定義されています。
-/// note | 情報
+/// note | 備考
Starlette の `lifespan` ハンドラについては、[Starlette の Lifespan ドキュメント](https://www.starlette.dev/lifespan/)で詳しく読むことができます。
///
-## FastAPI スポンサーによる SDK ジェネレータ { #sdk-generators-from-fastapi-sponsors }
-
-このセクションでは、FastAPI をスポンサーしている企業による、**ベンチャー支援**および**企業支援**のソリューションを紹介します。これらの製品は、高品質な生成 SDK に加えて、**追加機能**や**統合**を提供します。
-
-✨ [**FastAPI をスポンサーする**](../help-fastapi.md#sponsor-the-author) ✨ ことで、これらの企業はフレームワークとその**エコシステム**の健全性と**持続可能性**を支援しています。
-
-この支援は、FastAPI の**コミュニティ**(皆さん)への強いコミットメントの表明でもあり、**優れたサービス**の提供だけでなく、堅牢で発展するフレームワーク FastAPI を支える姿勢を示しています。🙇
-
-例えば、次のようなものがあります:
-
-* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-
-これらのソリューションの中にはオープンソースや無料枠を提供するものもあり、金銭的コミットメントなしで試すことができます。他の商用 SDK ジェネレータも存在し、オンラインで見つけられます。🤓
-
## TypeScript SDK を作成する { #create-a-typescript-sdk }
まずは簡単な FastAPI アプリから始めます:
## Base64 とファイル { #base64-vs-files }
-バイナリデータのアップロードにはまず、JSON にエンコードする代わりに [Request Files](../tutorial/request-files.md) を、バイナリデータの送信には [カスタムレスポンス - FileResponse](./custom-response.md#fileresponse--fileresponse-) を使えるか検討してください。
+バイナリデータのアップロードにはまず、JSON にエンコードする代わりに [リクエストファイル](../tutorial/request-files.md) を、バイナリデータの送信には [カスタムレスポンス - FileResponse](./custom-response.md#fileresponse) を使えるか検討してください。
JSON は UTF-8 でエンコードされた文字列のみを含められるため、生のバイト列は含められません。
* API 利用者(外部開発者)に通知を送り返します。
* これは(あなたの API から)外部開発者が提供する *外部 API* に POST リクエストを送ることで行われます(これが「コールバック」です)。
-## 通常の FastAPI アプリ { #the-normal-fastapi-app }
+## 通常の **FastAPI** アプリ { #the-normal-fastapi-app }
まず、コールバックを追加する前の通常の API アプリがどうなるか見てみましょう。
しかし、あなたはすでに **FastAPI** で API の自動ドキュメントを簡単に作る方法を知っています。
-その知識を使って、*外部 API* がどうあるべきかをドキュメント化します……つまり、外部 API が実装すべき *path operation(s)*(あなたの API が呼び出すもの)を作成します。
+その知識を使って、*外部 API* がどうあるべきかをドキュメント化します... つまり、外部 API が実装すべき *path operation(s)*(あなたの API が呼び出すもの)を作成します。
/// tip | 豆知識
///
-### コールバック用 APIRouter を作成 { #create-a-callback-apirouter }
+### コールバック用 `APIRouter` を作成 { #create-a-callback-apirouter }
まず、1 つ以上のコールバックを含む新しい `APIRouter` を作成します。
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *}
-### コールバックの path operation を作成 { #create-the-callback-path-operation }
+### コールバックの *path operation* を作成 { #create-the-callback-path-operation }
上で作成したのと同じ `APIRouter` を使って、コールバックの *path operation* を作成します。
# レスポンス - ステータスコードの変更 { #response-change-status-code }
+
すでに、デフォルトの[レスポンスのステータスコード](../tutorial/response-status-code.md)を設定できることをご存知かもしれません。
しかし場合によっては、デフォルトとは異なるステータスコードを返す必要があります。
# レスポンスの Cookie { #response-cookies }
+
## `Response` パラメータを使う { #use-a-response-parameter }
*path operation 関数*で `Response` 型のパラメータを宣言できます。
# レスポンスヘッダー { #response-headers }
+
## `Response` パラメータを使う { #use-a-response-parameter }
(Cookie と同様に)*path operation 関数*で `Response` 型のパラメータを宣言できます。
# OAuth2 のスコープ { #oauth2-scopes }
+
OAuth2 のスコープは **FastAPI** で直接利用でき、シームレスに統合されています。
これにより、OAuth2 標準に従った、よりきめ細かな権限システムを、OpenAPI 対応アプリケーション(および API ドキュメント)に統合できます。
Pydantic モデルと同様に、型アノテーションと(必要なら)デフォルト値を持つクラス属性を宣言します。
-`Field()` による追加バリデーションなど、Pydantic モデルで使えるのと同じバリデーション機能をすべて利用できます。
+異なるデータ型や `Field()` による追加バリデーションなど、Pydantic モデルで使えるのと同じバリデーション機能とツールをすべて利用できます。
{* ../../docs_src/settings/tutorial001_py310.py hl[2,5:8,11] *}
JSON として構造化できるデータをストリームしたい場合は、[JSON Lines をストリームする](../tutorial/stream-json-lines.md) を参照してください。
-しかし、純粋なバイナリデータや文字列をストリームしたい場合は、次のようにできます。
+しかし、**純粋なバイナリデータ**や文字列をストリームしたい場合は、次のようにできます。
-/// note | 情報
+/// note | 備考
FastAPI 0.134.0 で追加されました。
## ユースケース { #use-cases }
-例えば、AI LLM サービスの出力をそのまま、純粋な文字列としてストリームしたい場合に使えます。
+例えば、**AI LLM** サービスの出力をそのまま、純粋な文字列としてストリームしたい場合に使えます。
-メモリに一度に全て読み込むことなく、読み込みながらチャンクごとに送ることで、巨大なバイナリファイルをストリームすることにも使えます。
+メモリに一度に全て読み込むことなく、読み込みながらチャンクごとに送ることで、**巨大なバイナリファイル**をストリームすることにも使えます。
-同様に、動画や音声をストリームすることもできます。処理しながら生成し、そのまま送信することも可能です。
+同様に、**動画**や**音声**をストリームすることもできます。処理しながら生成し、そのまま送信することも可能です。
## `yield` を使った `StreamingResponse` { #a-streamingresponse-with-yield }
-path operation 関数で `response_class=StreamingResponse` を宣言すると、`yield` を使ってデータをチャンクごとに順次送信できます。
+*path operation 関数*で `response_class=StreamingResponse` を宣言すると、`yield` を使ってデータをチャンクごとに順次送信できます。
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し、JSON などに変換しようとはしません。
-### 非 async な path operation 関数 { #non-async-path-operation-functions }
+### 非 async な *path operation 関数* { #non-async-path-operation-functions }
`async` なしの通常の `def` 関数でも同様に `yield` を使えます。
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
-つまり、`StreamingResponse` では型アノテーションに依存せず、送信したい形式に合わせてバイト列を生成・エンコードする「自由」と「責任」があなたにあります。 🤓
+つまり、`StreamingResponse` では型アノテーションに依存せず、送信したい形式に合わせてバイト列を生成・エンコードする**自由**と**責任**があなたにあります。 🤓
### バイト列をストリームする { #stream-bytes }
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
-その後、path operation 関数で `response_class=PNGStreamingResponse` としてこの新しいクラスを使用できます:
+その後、*path operation 関数*で `response_class=PNGStreamingResponse` としてこの新しいクラスを使用できます:
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
また、多くの場合、ディスクやネットワークから読み出すため、読み取りはブロッキング(イベントループをブロックし得る)処理になります。
-/// note | 情報
+/// note | 備考
上記の例は例外で、`io.BytesIO` は既にメモリ上にあるため、読み取りが何かをブロックすることはありません。
///
-イベントループのブロッキングを避けるには、path operation 関数を `async def` ではなく通常の `def` で宣言してください。そうすると FastAPI はその関数をスレッドプールワーカー上で実行し、メインループのブロッキングを避けます。
+イベントループのブロッキングを避けるには、*path operation 関数*を `async def` ではなく通常の `def` で宣言してください。そうすると FastAPI はその関数をスレッドプールワーカー上で実行し、メインループのブロッキングを避けます。
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
# WSGI の組み込み - Flask、Django など { #including-wsgi-flask-django-others }
+
[サブアプリケーション - マウント](sub-applications.md)、[プロキシの背後](behind-a-proxy.md) で見たように、WSGI アプリケーションをマウントできます。
そのために `WSGIMiddleware` を使用して、Flask や Django などの WSGI アプリをラップできます。
response = requests.get("http://example.com/some/url")
```
-対応するFastAPIのAPIのpath operationはこのようになります:
+対応するFastAPI側のAPI *path operation* はこのようになります:
```Python hl_lines="1"
@app.get("/some/url")
return {"message": "Hello World"}
```
- `requests.get(...)` と`@app.get(...)` には類似点が見受けられます。
+`requests.get(...)` と`@app.get(...)` には類似点が見受けられます。
/// tip | **FastAPI**へ与えたインスピレーション
* シンプルで直感的なAPIを持っている点。
-* HTTPメソッド名を直接利用し、単純で直感的である。
+* HTTPメソッド名 (operation) を直接利用し、単純で直感的である。
* 適切なデフォルト値を持ちつつ、強力なカスタマイズ性を持っている。
///
* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
-そして、これらのフルスタックジェネレーターは、[**FastAPI** Project Generators](project-generation.md)の元となっていました。
+そして、これらのフルスタックジェネレーターは、[**FastAPI** プロジェクトジェネレーター](project-generation.md)の元となっていました。
/// note | 備考
パラメータはTypeScriptの型で記述されるので (Pythonの型ヒントに似ています) 、エディタのサポートはとても良いです。
-ã\81\97ã\81\8bã\81\97ã\80\81TypeScriptã\81®ã\83\87ã\83¼ã\82¿ã\81¯JavaScriptã\81¸ã\81®ã\82³ã\83³ã\83\91ã\82¤ã\83«å¾\8cã\81«ã\81¯æ®\8bã\81\95ã\82\8cã\81ªã\81\84ã\81\9fã\82\81ã\80\81ã\83\90ã\83ªã\83\87ã\83¼ã\82·ã\83§ã\83³ã\80\81ã\82·ã\83ªã\82¢ã\83©ã\82¤ã\82¼ã\83¼ã\82·ã\83§ã\83³ã\80\81ã\83\89ã\82ã\83¥ã\83¡ã\83³ã\83\88å\8c\96ã\82\92å\90\8cæ\99\82ã\81«å®\9a義ã\81\99ã\82\8bã\81®ã\81«å\9e\8bã\81«é ¼ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82ã\81\9dã\81®ã\81\9fã\82\81、バリデーション、シリアライゼーション、スキーマの自動生成を行うためには、多くの場所でデコレータを追加する必要があり、非常に冗長になります。
+ã\81\97ã\81\8bã\81\97ã\80\81TypeScriptã\81®ã\83\87ã\83¼ã\82¿ã\81¯JavaScriptã\81¸ã\81®ã\82³ã\83³ã\83\91ã\82¤ã\83«å¾\8cã\81«ã\81¯æ®\8bã\81\95ã\82\8cã\81ªã\81\84ã\81\9fã\82\81ã\80\81ã\83\90ã\83ªã\83\87ã\83¼ã\82·ã\83§ã\83³ã\80\81ã\82·ã\83ªã\82¢ã\83©ã\82¤ã\82¼ã\83¼ã\82·ã\83§ã\83³ã\80\81ã\83\89ã\82ã\83¥ã\83¡ã\83³ã\83\88å\8c\96ã\82\92å\90\8cæ\99\82ã\81«å®\9a義ã\81\99ã\82\8bã\81®ã\81«å\9e\8bã\81«é ¼ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82ã\81\93ã\81®ã\81\93ã\81¨ã\81¨ã\81\84ã\81\8fã\81¤ã\81\8bã\81®è¨è¨\88ä¸\8aã\81®å\88¤æ\96ã\81«ã\82\88ã\82\8a、バリデーション、シリアライゼーション、スキーマの自動生成を行うためには、多くの場所でデコレータを追加する必要があり、非常に冗長になります。
入れ子になったモデルをうまく扱えません。そのため、リクエストのJSONボディが内部フィールドを持つJSONオブジェクトで、それが順番にネストされたJSONオブジェクトになっている場合、適切にドキュメント化やバリデーションをすることができません。
同じフレームワークを使ってAPIとCLIを作成できる、面白く珍しい機能を持っています。
-以前のPythonの同期型Webフレームワーク標準 (WSGI) をベースにしているため、Websocketなどは扱えませんが、それでも高性能です。
+以前のPythonの同期型Webフレームワーク標準 (WSGI) をベースにしているため、WebSocketなどは扱えませんが、それでも高性能です。
/// note | 備考
-HugはTimothy Crosleyにより作成されました。彼は[`isort`](https://github.com/timothycrosley/isort)など、Pythonのファイル内のインポートの並び替えを自動的におこうなう素晴らしいツールの開発者です。
+HugはTimothy Crosleyにより作成されました。彼は[`isort`](https://github.com/timothycrosley/isort)など、Pythonのファイル内のインポートの並び替えを自動的に行う素晴らしいツールの開発者です。
///
-/// tip | **FastAPI**ã\81¸ä¸\8eã\81\88ã\81\9fã\82¤ã\83³ã\82¹ã\83\94ã\83¬ã\83¼ã\82·ã\83§ã\83³
+/// tip | **FastAPI**ã\81«ã\82¤ã\83³ã\82¹ã\83\94ã\83¬ã\83¼ã\82·ã\83§ã\83³ã\82\92ä¸\8eã\81\88ã\81\9fã\82¢ã\82¤ã\83\87ã\82¢
HugはAPIStarに部分的なインスピレーションを与えており、私が発見した中ではAPIStarと同様に最も期待の持てるツールの一つでした。
* インプロセスのバックグラウンドタスク。
* 起動およびシャットダウンイベント。
* HTTPXに基づいて構築されたテストクライアント。
-* CORS、GZip、静的ファイル、ストリーミング応答。
+* CORS、GZip、静的ファイル、ストリーミングレスポンス。
* セッションとクッキーのサポート。
* 100%のテストカバレッジ。
* 100%の型注釈付きコードベース。
///
-## ベンチマーク と スピード { #benchmarks-and-speed }
+## ベンチマークと速度 { #benchmarks-and-speed }
Uvicorn、Starlette、FastAPIの違いを理解、比較、確認するには、[ベンチマーク](benchmarks.md)を確認してください。
この「並列ハンバーガー」のシナリオでは、あなたは 2 つのプロセッサ (あなたと好きな人) を持つコンピュータ/プログラム 🤖 で、どちらも長い間 🕙「カウンターでの待機」に注意 ⏯ を専念しています。
-ファストフード店には 8 個のプロセッサ (レジ係/料理人) があります。一方、並行ハンバーガーの店には (レジ係 1、人、料理人 1 人の) 2 個しかなかったかもしれません。
+ファストフード店には 8 個のプロセッサ (レジ係/料理人) があります。一方、並行ハンバーガーの店には (レジ係 1 人、料理人 1 人の) 2 個しかなかったかもしれません。
それでも、最終的な体験は最良とは言えません。😞
## FastAPI Cloud { #fastapi-cloud }
-**[FastAPI Cloud](https://fastapicloud.com)** ã\81¯ã\80\81**FastAPI** ã\81®ä½\9cè\80\85ã\81¨同じチームによって作られています。
+**[FastAPI Cloud](https://fastapicloud.com)** ã\81¯ã\80\81**FastAPI** ã\81®ä½\9cè\80\85ã\81\8aã\82\88ã\81³同じチームによって作られています。
API の**構築**、**デプロイ**、**アクセス**までのプロセスを、最小限の手間で効率化します。
## クラウドプロバイダ - スポンサー { #cloud-providers-sponsors }
-他にもいくつかのクラウドプロバイダが ✨ [**FastAPI をスポンサーしています**](../help-fastapi.md#sponsor-the-author) ✨。🙇
+他にもいくつかのクラウドプロバイダが ✨ [**FastAPI をスポンサーしています**](https://github.com/sponsors/tiangolo) ✨。🙇
それらのガイドを参考にし、サービスを試してみるのもよいでしょう:
# デプロイメントのコンセプト { #deployments-concepts }
-**FastAPI**を用いたアプリケーションをデプロイするとき、もしくはどのようなタイプのWeb APIであっても、おそらく気になるコンセプトがいくつかあります。
-
-それらを活用することでアプリケーションを**デプロイするための最適な方法**を見つけることができます。
+**FastAPI**を用いたアプリケーションをデプロイするとき、もしくはどのようなタイプのWeb APIであっても、おそらく気になるコンセプトがいくつかあり、それらを活用することでアプリケーションを**デプロイするための最適な方法**を見つけることができます。
重要なコンセプトのいくつかを紹介します:
最終的な目的は、**安全な方法で**APIクライアントに**サービスを提供**し、**中断を回避**するだけでなく、**計算リソース**(例えばリモートサーバー/仮想マシン)を可能な限り効率的に使用することです。 🚀
-この章では前述した**コンセプト**についてそれぞれ説明します。
-
-この説明を通して、普段とは非常に異なる環境や存在しないであろう**将来の**環境に対し、デプロイの方法を決める上で必要な**直感**を与えてくれることを願っています。
+ここではこれらの**コンセプト**についてもう少し説明します。それによって、普段とは非常に異なる環境や存在しないであろう**将来の**環境に対し、APIのデプロイ方法を決める上で必要な**直感**を与えてくれることを願っています。
これらのコンセプトを意識することにより、**あなた自身のAPI**をデプロイするための最適な方法を**評価**し、**設計**することができるようになるでしょう。
[前チャプターのHTTPSについて](https.md)では、HTTPSがどのようにAPIを暗号化するのかについて学びました。
-通常、アプリケーションサーバにとって**外部の**コンポーネントである**TLS Termination Proxy**によって提供されることが一般的です。このプロキシは通信の暗号化を担当します。
+また、HTTPSは通常、アプリケーションサーバにとって**外部の**コンポーネントである**TLS Termination Proxy**によって提供されることも確認しました。
-さらに、HTTPS証明書の更新を担当するものが必要で、同じコンポーネントが担当することもあれば、別のコンポーネントが担当することもあります。
+さらに、**HTTPS証明書の更新**を担当するものが必要で、同じコンポーネントが担当することもあれば、別のコンポーネントが担当することもあります。
### HTTPS 用ツールの例 { #example-tools-for-https }
+
TLS Termination Proxyとして使用できるツールには以下のようなものがあります:
* Traefik
しかしながら、**アプリケーション全体をクラッシュさせるようなコードを書いて**UvicornとPythonをクラッシュさせるようなケースもあるかもしれません。💥
-それでも、ある箇所でエラーが発生したからといって、アプリケーションを停止させたままにしたくないでしょう。 少なくとも壊れていない*path operation*については、**実行し続けたい**はずです。
+それでも、ある箇所でエラーが発生したからといって、アプリケーションを停止させたままにしたくないでしょう。 少なくとも壊れていない*path operations*については、**実行し続けたい**はずです。
### クラッシュ後の再起動 { #restart-after-crash }
-しかし、実行中の**プロセス**をクラッシュさせるような本当にひどいエラーの場合、少なくとも2〜3回ほどプロセスを**再起動**させる外部コンポーネントが必要でしょう。
+しかし、実行中の**プロセス**をクラッシュさせるような本当にひどいエラーの場合、少なくとも2〜3回ほどプロセスを**再起動**させる外部コンポーネントが必要でしょう...
/// tip | 豆知識
...とはいえ、アプリケーション全体が**すぐにクラッシュする**のであれば、いつまでも再起動し続けるのは意味がないでしょう。しかし、その場合はおそらく開発中か少なくともデプロイ直後に気づくと思われます。
-そこで、**将来**クラッシュする可能性があり、それでも再スタートさせることに意味があるような、主なケースに焦点を当ててみます。
+そこで、**将来**特定のケースで完全にクラッシュする可能性があり、それでも再スタートさせることに意味があるような、主なケースに焦点を当ててみます。
///
### サーバーメモリ { #server-memory }
-例えば、あなたのコードが **1GBのサイズの機械学習モデル**をロードする場合、APIで1つのプロセスを実行すると、少なくとも1GBのRAMを消費します。
-
-また、**4つのプロセス**(4つのワーカー)を起動すると、それぞれが1GBのRAMを消費します。つまり、合計でAPIは**4GBのRAM**を消費することになります。
+例えば、あなたのコードが **1GBのサイズの機械学習モデル**をロードする場合、APIで1つのプロセスを実行すると、少なくとも1GBのRAMを消費します。また、**4つのプロセス**(4つのワーカー)を起動すると、それぞれが1GBのRAMを消費します。つまり、合計でAPIは**4GBのRAM**を消費することになります。
リモートサーバーや仮想マシンのRAMが3GBしかない場合、4GB以上のRAMをロードしようとすると問題が発生します。🚨
これを実現するにはいくつかのアプローチがありますが、具体的な戦略については次の章(Dockerやコンテナの章など)で詳しく説明します。
-考慮すべき主な制約は、**パブリックIP**の**ポート**を処理する**単一の**コンポーネントが存在しなければならないということです。
-
-そして、レプリケートされた**プロセス/ワーカー**に通信を**送信**する方法を持つ必要があります。
+考慮すべき主な制約は、**パブリックIP**の**ポート**を処理する**単一の**コンポーネントが存在しなければならないということです。そして、レプリケートされた**プロセス/ワーカー**に通信を**送信**する方法を持つ必要があります。
考えられる組み合わせと戦略をいくつか紹介します:
* 1つのUvicornの**プロセスマネージャー**が**IP**と**ポート**をリッスンし、**複数のUvicornワーカー・プロセス**を起動する。
* **Kubernetes**やその他の分散**コンテナ・システム**
* **Kubernetes**レイヤーの何かが**IP**と**ポート**をリッスンする。レプリケーションは、**複数のコンテナ**にそれぞれ**1つのUvicornプロセス**を実行させることで行われる。
-* **クラウド・サービス**によるレプリケーション
+* これを代わりに処理する**クラウド・サービス**
* クラウド・サービスはおそらく**あなたのためにレプリケーションを処理**します。**実行するプロセス**や使用する**コンテナイメージ**を定義できるかもしれませんが、いずれにせよ、それはおそらく**単一のUvicornプロセス**であり、クラウドサービスはそのレプリケーションを担当するでしょう。
/// tip | 豆知識
そのため、アプリケーションを開始する前の**事前のステップ**を実行する**単一のプロセス**を用意したいと思われます。
-そして、それらの事前のステップを実行しているのが単一のプロセスであることを確認する必要があります。このことはその後アプリケーション自体のために**複数のプロセス**(複数のワーカー)を起動した場合も同様です。
-
-これらのステップが**複数のプロセス**によって実行された場合、**並列**に実行されることによって作業が**重複**することになります。そして、もしそのステップがデータベースのマイグレーションのような繊細なものであった場合、互いに競合を引き起こす可能性があります。
+そして、それらの事前のステップを実行しているのが単一のプロセスであることを確認する必要があります。これはその後アプリケーション自体のために**複数のプロセス**(複数のワーカー)を起動した場合も同様です。これらのステップが**複数のプロセス**によって実行された場合、**並列**に実行されることによって作業が**重複**することになります。そして、もしそのステップがデータベースのマイグレーションのような繊細なものであった場合、互いに競合を引き起こす可能性があります。
もちろん、事前のステップを何度も実行しても問題がない場合もあり、その際は対処がかなり楽になります。
考えられるアイデアをいくつか挙げてみます:
-* アプリコンテナの前に実行されるKubernetesのInitコンテナ
+* アプリコンテナの前に実行されるKubernetesの「Init Container」
* 事前のステップを実行し、アプリケーションを起動するbashスクリプト
* 利用するbashスクリプトを起動/再起動したり、エラーを検出したりする方法は以前として必要になるでしょう。
## リソースの利用 { #resource-utilization }
-あなたのサーバーは**リソース**であり、プログラムを実行しCPUの計算時間や利用可能なRAMメモリを消費または**利用**することができます。
+あなたのサーバーは(複数の場合も)**リソース**であり、プログラムを実行しCPUの計算時間や利用可能なRAMメモリを消費または**利用**することができます。
システムリソースをどれくらい消費/利用したいですか? 「少ない方が良い」と考えるのは簡単かもしれないですが、実際には、**クラッシュせずに可能な限り**最大限に活用したいでしょう。
この場合、**1つ余分なサーバー**を用意し、その上でいくつかのプロセスを実行し、すべてのサーバーが**十分なRAMとCPU時間を持つようにする**のがよいでしょう。
-また、何らかの理由でAPIの利用が急増する可能性もあります。もしかしたらそれが流行ったのかもしれないし、他のサービスやボットが使い始めたのかもしれないです。そのような場合に備えて、余分なリソースを用意しておくと安心でしょう。
-
-例えば、リソース使用率の**50%から90%の範囲**で**任意の数字**をターゲットとすることができます。
+また、何らかの理由でAPIの利用が**急増**する可能性もあります。もしかしたらそれが流行ったのかもしれないし、他のサービスやボットが使い始めたのかもしれないです。そのような場合に備えて、余分なリソースを用意しておくと安心でしょう。
-重要なのは、デプロイメントを微調整するためにターゲットを設定し測定することが、おそらく使用したい主要な要素であることです。
+例えば、リソース使用率の**50%から90%の範囲**で**任意の数字**をターゲットとすることができます。重要なのは、デプロイメントを微調整するために測定して使用したい主要な要素は、おそらくそれらであるということです。
`htop`のような単純なツールを使って、サーバーで使用されているCPUやRAM、あるいは各プロセスで使用されている量を見ることができます。あるいは、より複雑な監視ツールを使って、サーバに分散して使用することもできます。
///
<details>
-<summary>Dockerfile Preview 👀</summary>
+<summary>Dockerfile プレビュー 👀</summary>
```Dockerfile
FROM python:3.14
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
-# If running behind a proxy like Nginx or Traefik add --proxy-headers
+# Nginx や Traefik のようなプロキシの背後で実行する場合は --proxy-headers を追加します
# CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"]
```
✅ **Exec** 形式:
```Dockerfile
-# ✅ Do this
+# ✅ こうしてください
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
```
⛔️ **Shell** 形式:
```Dockerfile
-# ⛔️ Don't do this
+# ⛔️ こうしないでください
CMD fastapi run app/main.py --port 80
```
///
-### Dockerã\82³ã\83³ã\83\86ã\83\8aã\81®起動する { #start-the-docker-container }
+### Dockerã\82³ã\83³ã\83\86ã\83\8aã\82\92起動する { #start-the-docker-container }
* イメージに基づいてコンテナを実行します:
* Nginx
* HAProxy
-
## Let's Encrypt { #lets-encrypt }
Let's Encrypt以前は、これらの**HTTPS証明書**は信頼できる第三者によって販売されていました。
### SNI拡張機能付きのTLS { #tls-with-sni-extension }
-サーバー内の**1つのプロセス**だけが、特定の**IPアドレス**の特定の**ポート**で待ち受けることができます。
-
-同じIPアドレスの他のポートで他のプロセスがリッスンしている可能性もありますが、IPアドレスとポートの組み合わせごとに1つだけです。
+サーバー内の**1つのプロセス**だけが、特定の**IPアドレス**の特定の**ポート**で待ち受けることができます。同じIPアドレスの他のポートで他のプロセスがリッスンしている可能性もありますが、IPアドレスとポートの組み合わせごとに1つだけです。
-TLSï¼\88HTTPSï¼\89ã\81¯ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81§`443`ã\81¨ã\81\84ã\81\86ç\89¹å®\9aã\81®ã\83\9dã\83¼ã\83\88ã\82\92使ç\94¨ã\81\99ã\82\8b。つまり、これが必要なポートです。
+TLSï¼\88HTTPSï¼\89ã\81¯ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81§`443`ã\81¨ã\81\84ã\81\86ç\89¹å®\9aã\81®ã\83\9dã\83¼ã\83\88ã\82\92使ç\94¨ã\81\97ã\81¾ã\81\99。つまり、これが必要なポートです。
このポートをリクエストできるのは1つのプロセスだけなので、これを実行するプロセスは**TLS Termination Proxy**となります。
次に証明書を使用して、クライアントとTLS Termination Proxy は、 **TCP通信**の残りを**どのように暗号化するかを決定**します。これで**TLSハンドシェイク**の部分が完了します。
-この後、クライアントとサーバーは**暗号化されたTCP接続**を持ちます。そして、その接続を使って実際の**HTTP通信**を開始することができます。
+ã\81\93ã\81®å¾\8cã\80\81ã\82¯ã\83©ã\82¤ã\82¢ã\83³ã\83\88ã\81¨ã\82µã\83¼ã\83\90ã\83¼ã\81¯**æ\9a\97å\8f·å\8c\96ã\81\95ã\82\8cã\81\9fTCPæ\8e¥ç¶\9a**ã\82\92æ\8c\81ã\81¡ã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81\8cTLSã\81®æ\8f\90ä¾\9bã\81\99ã\82\8bã\82\82ã\81®ã\81§ã\81\99ã\80\82ã\81\9dã\81\97ã\81¦ã\80\81ã\81\9dã\81®æ\8e¥ç¶\9aã\82\92使ã\81£ã\81¦å®\9fé\9a\9bã\81®**HTTPé\80\9aä¿¡**ã\82\92é\96\8bå§\8bã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82
-これが**HTTPS**であり、純粋な(暗号化されていない)TCP接続ではなく、**セキュアなTLS接続**の中に**HTTP**があるだけです。
+これが**HTTPS**であり、純粋な(暗号化されていない)TCP接続ではなく、**セキュアなTLS接続**の中に単なる**HTTP**があるだけです。
/// tip | 豆知識
### HTTPS レスポンス { #https-response }
-TLS Termination Proxyは次に、事前に合意が取れている暗号(`someapp.example.com`の証明書から始まる)を使って**レスポンスを暗号化し**、ブラウザに送り返す。
+TLS Termination Proxyã\81¯æ¬¡ã\81«ã\80\81äº\8bå\89\8dã\81«å\90\88æ\84\8fã\81\8cå\8f\96ã\82\8cã\81¦ã\81\84ã\82\8bæ\9a\97å\8f·(`someapp.example.com`ã\81®è¨¼æ\98\8eæ\9b¸ã\81\8bã\82\89å§\8bã\81¾ã\82\8b)ã\82\92使ã\81£ã\81¦**ã\83¬ã\82¹ã\83\9dã\83³ã\82¹ã\82\92æ\9a\97å\8f·å\8c\96ã\81\97**ã\80\81ã\83\96ã\83©ã\82¦ã\82¶ã\81«é\80\81ã\82\8aè¿\94ã\81\97ã\81¾ã\81\99ã\80\82
その後ブラウザでは、レスポンスが有効で正しい暗号キーで暗号化されていることなどを検証します。そして、ブラウザはレスポンスを**復号化**して処理します。
* これは、同じTLS Termination Proxyが証明書の更新処理も行う場合に非常に便利な理由の1つです。
* そうでなければ、TLS Termination Proxyを一時的に停止し、証明書を取得するために更新プログラムを起動し、TLS Termination Proxyで証明書を設定し、TLS Termination Proxyを再起動しなければならないかもしれません。TLS Termination Proxyが停止している間はアプリが利用できなくなるため、これは理想的ではありません。
-
アプリを提供しながらこのような更新処理を行うことは、アプリケーション・サーバー(Uvicornなど)でTLS証明書を直接使用するのではなく、TLS Termination Proxyを使用して**HTTPSを処理する別のシステム**を用意したくなる主な理由の1つです。
## プロキシ転送ヘッダー { #proxy-forwarded-headers }
# サーバーを手動で実行する { #run-a-server-manually }
-## fastapi run コマンドを使う { #use-the-fastapi-run-command }
+## `fastapi run` コマンドを使う { #use-the-fastapi-run-command }
結論として、FastAPI アプリケーションを提供するには `fastapi run` を使います:
- **FastAPI Cloud へデプロイ** - [FastAPI Cloud](https://fastapicloud.com/) にワンクリックでアプリをデプロイできます。
- **アプリケーションログのストリーミング** - FastAPI Cloud にデプロイしたアプリから、レベルフィルタやテキスト検索付きでリアルタイムにログをストリーミングできます。
-拡張機能の機能に慣れるには、コマンドパレット(<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>、macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>)を開き、"Welcome: Open walkthrough..." を選択してから、"Get started with FastAPI" のウォークスルーを選んでください。
+拡張機能の機能に慣れるには、コマンドパレット(<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>、macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>)を開き、「Welcome: Open walkthrough...」を選択してから、「Get started with FastAPI」のウォークスルーを選んでください。
つまり、環境変数からPythonで読み取る**あらゆる値**は **`str`になり**、他の型への変換やバリデーションはコード内で行う必要があります。
-環境変数を使って**アプリケーション設定**を扱う方法については、[高度なユーザーガイド - Settings and Environment Variables](./advanced/settings.md)で詳しく学べます。
+環境変数を使って**アプリケーション設定**を扱う方法については、[高度なユーザーガイド - 設定と環境変数](./advanced/settings.md)で詳しく学べます。
## `PATH`環境変数 { #path-environment-variable }
////
-この情報は、[Virtual Environments](virtual-environments.md)について学ぶ際にも役立ちます。
+この情報は、[仮想環境](virtual-environments.md)について学ぶ際にも役立ちます。
## まとめ { #conclusion }
多くの場合、環境変数がどのように役立ち、すぐに適用できるのかはあまり明確ではありません。しかし、開発中のさまざまなシナリオで何度も登場するため、知っておくとよいでしょう。
-例えば、次のセクションの[Virtual Environments](virtual-environments.md)でこの情報が必要になります。
+例えば、次のセクションの[仮想環境](virtual-environments.md)でこの情報が必要になります。
すべてに妥当な **デフォルト** があり、どこでもオプションで構成できます。必要に応じてすべてのパラメータを微調整して、求める API を定義できます。
-ã\81\97ã\81\8bã\81\97ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81®ã\81¾ã\81¾ã\81§ã\82\82ã\80\81ã\81\99ã\81¹ã\81¦ **ã\81\86ã\81¾ã\81\8få\8b\95ã\81\8dã\81¾ã\81\99**。
+ã\81\97ã\81\8bã\81\97ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81®ã\81¾ã\81¾ã\81§ã\82\82ã\80\81ã\81\99ã\81¹ã\81¦ **ã\80\8cã\81\86ã\81¾ã\81\8få\8b\95ã\81\8dã\81¾ã\81\99ã\80\8d**。
### 検証 { #validation }
* 依存関係は依存関係を持つこともでき、階層または **依存関係の「グラフ」** を作成できます。
* すべてフレームワークによって**自動的に処理**されます。
-* すべての依存関係はリクエストからデータを要求でき、*path operation* の制約と自動ドキュメントを**拡張**できます。
+* すべての依存関係はリクエストからデータを要求でき、path operation の制約と自動ドキュメントを**拡張**できます。
* 依存関係で定義された *path operation* のパラメータについても**自動検証**されます。
* 複雑なユーザー認証システム、**データベース接続** などのサポート。
* **データベースやフロントエンド等との妥協は不要**。すべてと簡単に統合できます。
# ヘルプ { #help }
+
FastAPI を手助けしたい、または FastAPI についてヘルプが必要ですか?
応援したりヘルプを得たりする簡単な方法がいくつかあります。
これらは文字列ではなく **JavaScript** のオブジェクトであるため、Python のコードから直接渡すことはできません。
-ã\81\9dã\81®ã\82\88ã\81\86ã\81ª JavaScript å°\82ç\94¨ã\81®è¨å®\9aã\82\92使ã\81\86å¿\85è¦\81ã\81\8cã\81\82ã\82\8bå ´å\90\88ã\81¯ã\80\81ä¸\8aè¨\98ã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81®æ\96¹æ³\95ã\82\92使ç\94¨ã\81\97ã\80\81Swagger UI ã\81® path operation をオーバーライドして、必要な JavaScript を手動で記述してください。
+ã\81\9dã\81®ã\82\88ã\81\86ã\81ª JavaScript å°\82ç\94¨ã\81®è¨å®\9aã\82\92使ã\81\86å¿\85è¦\81ã\81\8cã\81\82ã\82\8bå ´å\90\88ã\81¯ã\80\81ä¸\8aè¨\98ã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81®æ\96¹æ³\95ã\82\92使ç\94¨ã\81§ã\81\8dã\81¾ã\81\99ã\80\82Swagger UI ã\81® *path operation* å\85¨ä½\93をオーバーライドして、必要な JavaScript を手動で記述してください。
これは「上級」機能です。
-FastAPI を始めたばかりの場合は、このセクションは読み飛ばしてもよいでしょう。
+**FastAPI** を始めたばかりの場合は、このセクションは読み飛ばしてもよいでしょう。
///
# GraphQL { #graphql }
+
**FastAPI** は **ASGI** 標準に基づいているため、ASGI に対応した任意の **GraphQL** ライブラリを簡単に統合できます。
同じアプリケーション内で通常の FastAPI の *path operation* と GraphQL を組み合わせて使えます。
FastAPI 0.126.0 で Pydantic v1 のサポートは終了しましたが、しばらくの間は `pydantic.v1` は利用可能でした。
+FastAPI 0.128.0 で `pydantic.v1` のサポートも終了したため、FastAPI の最新バージョンでは Pydantic v2 が必要です。
+
/// warning | 注意
Pydantic チームは Python の最新バージョン、つまり **Python 3.14** から、Pydantic v1 のサポートを終了しました。
### v2 内の Pydantic v1 に対する FastAPI のサポート { #fastapi-support-for-pydantic-v1-in-v2 }
+/// warning | 注意
+
+この FastAPI による `pydantic.v1` モデルのサポートは **FastAPI 0.119.0** で追加され、**FastAPI 0.128.0** で削除されました。これは Pydantic v2 への移行のための一時的な支援を意図したものでした。
+
+現在のバージョンの FastAPI では、アプリで `pydantic.v1` モデルを使用するとエラーが発生します。
+
+このセクションの残りは、それらの古いバージョンでのみ利用可能だった一時的なサポートについて説明します。
+
+///
+
FastAPI 0.119.0 以降では、移行を容易にするため、Pydantic v2 内の Pydantic v1 に対する部分的サポートもあります。
そのため、Pydantic を v2 の最新に上げ、インポートを `pydantic.v1` サブモジュールに切り替えるだけで、多くの場合そのまま動作します。
### 段階的に移行 { #migrate-in-steps }
+/// warning | 注意
+
+以下で説明する、同じアプリ内で Pydantic v1 と v2 のモデルを併用する段階的移行は、**FastAPI 0.119.0 から 0.127.x** でのみ動作します。これは **FastAPI 0.128.0** で削除され、最新バージョンでは **Pydantic v2** モデルが必要です。
+
+///
+
/// tip | 豆知識
まずは `bump-pydantic` を試してください。テストが通り、問題なければコマンド一発で完了です。✨
ドキュメントから試してレスポンスを確認すると、コードでは一方の `description` フィールドに何も追加していないにもかかわらず、JSON レスポンスにはデフォルト値(`null`)が含まれています:
<div class="screenshot">
-<img src="/img/tutorial/separate-openapi_schemas/image02.png">
+<img src="/img/tutorial/separate-openapi-schemas/image02.png">
</div>
つまりそのフィールドには **常に値があります**。値が `None`(JSON では `null`)になることがあるだけです。
一方、`Item-Output` では、`description` は **必須**(赤いアスタリスクあり)です。
<div class="screenshot">
-<img src="/img/tutorial/separate-openapi_schemas/image04.png">
+<img src="/img/tutorial/separate-openapi-schemas/image04.png">
</div>
この **Pydantic v2** の機能により、API ドキュメントはより **正確** になり、自動生成されたクライアントや SDK もより正確になります。これにより、より良い **開発者エクスペリエンス** と一貫性が得られます。🎉
* **簡単**: 簡単に利用・習得できるようにデザインされています。ドキュメントを読む時間を削減します。
* **短い**: コードの重複を最小限にします。各パラメータ宣言から複数の機能を得られます。バグも減ります。
* **堅牢性**: 自動対話型ドキュメントにより、本番環境向けのコードが得られます。
-* **Standards-based**: API のオープンスタンダードに基づいており(そして完全に互換性があります)、[OpenAPI](https://github.com/OAI/OpenAPI-Specification)(以前は Swagger として知られていました)や [JSON Schema](https://json-schema.org/) をサポートします。
+* **標準準拠**: API のオープンスタンダードに基づいており(そして完全に互換性があります)、[OpenAPI](https://github.com/OAI/OpenAPI-Specification)(以前は Swagger として知られていました)や [JSON Schema](https://json-schema.org/) をサポートします。
<small>* 本番アプリケーションを構築している社内開発チームのテストに基づく見積もりです。</small>
-## Sponsors { #sponsors }
+## スポンサー { #sponsors }
<!-- sponsors -->
-### Keystone Sponsor { #keystone-sponsor }
+### Keystone スポンサー { #keystone-sponsor }
<div class="fastapi-sponsors fastapi-sponsors--keystone">
{% for sponsor in sponsors.keystone -%}
{% endfor -%}
</div>
-### Gold Sponsors { #gold-sponsors }
+### Gold スポンサー { #gold-sponsors }
<div class="fastapi-sponsors fastapi-sponsors--gold">
{% for sponsor in sponsors.gold -%}
{% endfor -%}
</div>
-### Silver Sponsors { #silver-sponsors }
+### Silver スポンサー { #silver-sponsors }
<div class="fastapi-sponsors fastapi-sponsors--silver">
{% for sponsor in sponsors.silver -%}
<div class="only-github" markdown="1">
-"_[...] 最近 **FastAPI** を使っています。 [...] 実際に私のチームの全ての **Microsoft の機械学習サービス** で使用する予定です。 そのうちのいくつかのコアな **Windows** 製品と **Office** 製品に統合されつつあります。_"
+"_[...] 最近 **FastAPI** をたくさん使っています。 [...] 実際に私のチームの全ての **Microsoft の機械学習サービス** で使用する予定です。 そのうちのいくつかのコアな **Windows** 製品と **Office** 製品に統合されつつあります。_"
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(ref)</small></a></div>
</div>
<details markdown="1">
-<summary><code>fastapi dev</code> コマンドについて</summary>
+<summary><code>fastapi dev</code> コマンドについて...</summary>
`fastapi dev` コマンドは `main.py` ファイルを自動的に読み取り、その中の **FastAPI** アプリを検出し、[Uvicorn](https://www.uvicorn.dev) を使用してサーバーを起動します。
...に変更し、エディタが属性を自動補完し、その型を知ることを確認してください。
-
+
-より多くの機能を含む、より完全な例については、<a href="https://fastapi.tiangolo.com/ja/tutorial/">Tutorial - User Guide</a> を参照してください。
+より多くの機能を含む、より完全な例については、<a href="https://fastapi.tiangolo.com/ja/tutorial/">チュートリアル - ユーザーガイド</a> を参照してください。
-**ネタバレ注意**: tutorial - user guide には以下が含まれます。
+**ネタバレ注意**: チュートリアル - ユーザーガイドには以下が含まれます。
* **ヘッダー**、**Cookie**、**フォームフィールド**、**ファイル**など、他のさまざまな場所からの **パラメータ** 宣言。
* `maximum_length` や `regex` のような **検証制約** を設定する方法。
テンプレートは通常、特定のセットアップが含まれていますが、柔軟でカスタマイズできるように設計されています。これにより、プロジェクトの要件に合わせて変更・適応でき、優れた出発点になります。🏁
-このテンプレートを使って開始できます。初期セットアップ、セキュリティ、データベース、いくつかのAPIエンドポイントがすでに用意されています。
+ã\81\93ã\81®ã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\92使ã\81£ã\81¦é\96\8bå§\8bã\81§ã\81\8dã\81¾ã\81\99ã\80\82å\88\9dæ\9c\9fã\82»ã\83\83ã\83\88ã\82¢ã\83\83ã\83\97ã\81®å¤\9aã\81\8fã\80\81ã\82»ã\82ã\83¥ã\83ªã\83\86ã\82£ã\80\81ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\80\81ã\81\84ã\81\8fã\81¤ã\81\8bã\81®APIã\82¨ã\83³ã\83\89ã\83\9dã\82¤ã\83³ã\83\88ã\81\8cã\81\99ã\81§ã\81«ç\94¨æ\84\8fã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82
GitHubリポジトリ: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template)
一部の型は、角括弧内で「型パラメータ」を受け取り、内部の型を定義できます。例えば「文字列のリスト」は `list[str]` として宣言します。
-このように型パラメータを取れる型は **Generic types**(ジェネリクス)と呼ばれます。
+このように型パラメータを取れる型は **Generic types** または **Generics**(ジェネリクス)と呼ばれます。
次の組み込み型をジェネリクスとして(角括弧と内部の型で)使えます:
これは「`one_person` はクラス `Person` の **インスタンス** である」ことを意味します。
-「`one_person` は `Person` という名前の **クラ ス** である」という意味ではありません。
+「`one_person` は `Person` という名前の **クラス** である」という意味ではありません。
## Pydantic のモデル { #pydantic-models }
/// note | 備考
-すでにすべてのチュートリアルを終えて、型についての詳細を見るためにこのページに戻ってきた場合は、良いリソースとして [`mypy` の「チートシート`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) があります。
+すでにすべてのチュートリアルを終えて、型についての詳細を見るためにこのページに戻ってきた場合は、良いリソースとして [`mypy` の「チートシート」](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) があります。
///
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | 豆知識
# ボディ - ネストされたモデル { #body-nested-models }
+
**FastAPI** を使用すると、深くネストされた任意のモデルを定義、検証、文書化、使用することができます(Pydanticのおかげです)。
## リストのフィールド { #list-fields }
# リクエストボディ { #request-body }
+
クライアント(例えばブラウザ)からAPIにデータを送信する必要がある場合、**リクエストボディ**として送信します。
**リクエスト**ボディは、クライアントからAPIへ送信されるデータです。**レスポンス**ボディは、APIがクライアントに送信するデータです。
---
-Pycharmを使用する場合、次のことが可能です:
+PyCharmを使用する場合、次のことが可能です:
* 「実行」メニューをオープン。
* オプション「デバッグ...」を選択。
`yield`を持つ依存関係は、さまざまなユースケースをカバーし、いくつかの問題を修正するために、時間とともに進化してきました。
FastAPIの異なるバージョンで何が変わったのかを知りたい場合は、上級ガイドの[上級の依存関係 - `yield`、`HTTPException`、`except`、バックグラウンドタスクを持つ依存関係](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)で詳しく読めます。
+
## コンテキストマネージャ { #context-managers }
### 「コンテキストマネージャ」とは { #what-are-context-managers }
# 追加データ型 { #extra-data-types }
+
今まで、以下のような一般的なデータ型を使用してきました:
* `int`
複数のPydanticモデルを使用し、ケースごとに自由に継承します。
-エンティティが異なる「状態」を持たなければならない場合は、エンティティごとに単一のデータモデルを持つ必要はありません。`password`、`password_hash`、パスワードなしを含む状態を持つユーザー「エンティティ」の場合と同様です。
+エンティティが異なる「状態」を持たなければならない場合は、エンティティごとに単一のデータモデルを持つ必要はありません。`password`、`password_hash`、パスワードなしを含む状態を持つ**ユーザー**「エンティティ」の場合と同様です。
次に、[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)にアクセスします。
-先ほどとは異なる、自動生成された対話的APIドキュメントが表示されます([ReDoc](https://github.com/Rebilly/ReDoc)によって提供):
+代替の自動生成ドキュメントが表示されます([ReDoc](https://github.com/Rebilly/ReDoc)によって提供):

#### OpenAPIおよびJSONスキーマ { #openapi-and-json-schema }
-OpenAPIã\81¯APIã\81®ã\81\9fã\82\81ã\81®APIã\82¹ã\82ã\83¼ã\83\9eã\82\92å®\9a義ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9dã\81\97ã\81¦ã\80\81ã\81\9dã\81®ã\82¹ã\82ã\83¼ã\83\9eã\81¯**JSONã\83\87ã\83¼ã\82¿ã\82¹ã\82ã\83¼ã\83\9e**ã\81®æ¨\99æº\96è¦\8fæ ¼ã\81§ã\81\82ã\82\8b**JSON Schema**ã\82\92å\88©ç\94¨ã\81\99ã\82\8bAPIã\81«ã\82\88ã\81£ã\81¦é\80\81å\8f\97ã\81\95ã\82\8cã\82\8bã\83\87ã\83¼ã\82¿ã\81®å®\9a義ï¼\88ã\81¾ã\81\9fã\81¯ã\80\8cã\82¹ã\82ã\83¼ã\83\9eã\80\8dï¼\89ã\82\92å\90«ã\82\93ã\81§ã\81\84ます。
+OpenAPIã\81¯APIã\81®ã\81\9fã\82\81ã\81®APIã\82¹ã\82ã\83¼ã\83\9eã\82\92å®\9a義ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9dã\81\97ã\81¦ã\80\81ã\81\9dã\81®ã\82¹ã\82ã\83¼ã\83\9eã\81«ã\81¯ã\80\81JSONã\83\87ã\83¼ã\82¿ã\82¹ã\82ã\83¼ã\83\9eã\81®æ¨\99æº\96ã\81§ã\81\82ã\82\8b**JSON Schema**ã\82\92使ç\94¨ã\81\97ã\81¦ã\80\81APIã\81«ã\82\88ã\81£ã\81¦é\80\81å\8f\97ä¿¡ã\81\95ã\82\8cã\82\8bã\83\87ã\83¼ã\82¿ã\81®å®\9a義ï¼\88ã\81¾ã\81\9fã\81¯ã\80\8cã\82¹ã\82ã\83¼ã\83\9eã\80\8dï¼\89ã\81\8cå\90«ã\81¾ã\82\8cます。
#### `openapi.json`を確認 { #check-the-openapi-json }
### Step 2: `FastAPI`の「インスタンス」を生成 { #step-2-create-a-fastapi-instance }
{* ../../docs_src/first_steps/tutorial001_py310.py hl[3] *}
+
ここで、`app`変数が`FastAPI`クラスの「インスタンス」になります。
これが、すべてのAPIを作成するための主要なポイントになります。
# エラーハンドリング { #handling-errors }
+
APIを使用しているクライアントにエラーを通知する必要がある状況はたくさんあります。
このクライアントは、フロントエンドを持つブラウザ、誰かのコード、IoTデバイスなどが考えられます。
# チュートリアル - ユーザーガイド { #tutorial-user-guide }
+
このチュートリアルでは、**FastAPI**のほとんどの機能を使う方法を段階的に紹介します。
各セクションは前のセクションを踏まえた内容になっています。しかし、トピックごとに分割されているので、特定のAPIのニーズを満たすために、任意の特定のトピックに直接進めるようになっています。
| `title` | `str` | APIのタイトルです。 |
| `summary` | `str` | APIの短い要約です。 <small>OpenAPI 3.1.0、FastAPI 0.99.0 以降で利用できます。</small> |
| `description` | `str` | APIの短い説明です。Markdownを使用できます。 |
-| `version` | `string` | APIのバージョンです。これはOpenAPIのバージョンではなく、あなた自身のアプリケーションのバージョンです。たとえば `2.5.0` です。 |
+| `version` | `str` | APIのバージョンです。これはOpenAPIのバージョンではなく、あなた自身のアプリケーションのバージョンです。たとえば `2.5.0` です。 |
| `terms_of_service` | `str` | APIの利用規約へのURLです。指定する場合、URLである必要があります。 |
-| `contact` | `dict` | 公開されるAPIの連絡先情報です。複数のフィールドを含められます。 <details><summary><code>contact</code> fields</summary><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>連絡先の個人/組織を識別する名前です。</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>連絡先情報を指すURLです。URL形式である必要があります。</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>連絡先の個人/組織のメールアドレスです。メールアドレス形式である必要があります。</td></tr></tbody></table></details> |
-| `license_info` | `dict` | 公開されるAPIのライセンス情報です。複数のフィールドを含められます。 <details><summary><code>license_info</code> fields</summary><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>必須</strong>(<code>license_info</code> が設定されている場合)。APIに使用されるライセンス名です。</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>APIの [SPDX](https://spdx.org/licenses/) ライセンス式です。<code>identifier</code> フィールドは <code>url</code> フィールドと同時に指定できません。 <small>OpenAPI 3.1.0、FastAPI 0.99.0 以降で利用できます。</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>APIに使用されるライセンスへのURLです。URL形式である必要があります。</td></tr></tbody></table></details> |
+| `contact` | `dict` | 公開されるAPIの連絡先情報です。複数のフィールドを含められます。 <details><summary><code>contact</code> のフィールド</summary><table><thead><tr><th>パラメータ</th><th>型</th><th>説明</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>連絡先の個人/組織を識別する名前です。</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>連絡先情報を指すURLです。URL形式である必要があります。</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>連絡先の個人/組織のメールアドレスです。メールアドレス形式である必要があります。</td></tr></tbody></table></details> |
+| `license_info` | `dict` | 公開されるAPIのライセンス情報です。複数のフィールドを含められます。 <details><summary><code>license_info</code> のフィールド</summary><table><thead><tr><th>パラメータ</th><th>型</th><th>説明</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>必須</strong>(<code>license_info</code> が設定されている場合)。APIに使用されるライセンス名です。</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>APIの [SPDX](https://spdx.org/licenses/) ライセンス式です。<code>identifier</code> フィールドは <code>url</code> フィールドと同時に指定できません。 <small>OpenAPI 3.1.0、FastAPI 0.99.0 以降で利用できます。</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>APIに使用されるライセンスへのURLです。URL形式である必要があります。</td></tr></tbody></table></details> |
以下のように設定できます:
# Path Operationの設定 { #path-operation-configuration }
+
*path operationデコレータ*を設定するためのパラメータがいくつかあります。
/// warning | 注意
## `q` パラメータの型で `Annotated` を使う { #use-annotated-in-the-type-for-the-q-parameter }
-以前、[Python Types Intro](../python-types.md#type-hints-with-metadata-annotations) で `Annotated` を使ってパラメータにメタデータを追加できると説明したことを覚えていますか?
+以前、[Python 型入門](../python-types.md#type-hints-with-metadata-annotations) で `Annotated` を使ってパラメータにメタデータを追加できると説明したことを覚えていますか?
いよいよ FastAPI で使うときです。 🚀
http://localhost:8000/items/?q=foo&q=bar
```
-*path operation function* 内の *function parameter* `q` で、複数の `q` *query parameters'* 値(`foo` と `bar`)を Python の `list` として受け取ります。
+*path operation function* 内の *function parameter* `q` で、複数の `q` *クエリパラメータ*の値(`foo` と `bar`)を Python の `list` として受け取ります。
そのため、このURLのレスポンスは以下のようになります:
# クエリパラメータ { #query-parameters }
+
パスパラメータではない関数パラメータを宣言すると、それらは自動的に「クエリ」パラメータとして解釈されます。
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
# リクエストファイル { #request-files }
+
`File` を使って、クライアントがアップロードするファイルを定義できます。
/// note | 備考
## まとめ { #recap }
-ã\83\95ã\82©ã\83¼ã\83 ã\83\87ã\83¼ã\82¿ã\81®å\85¥å\8a\9bã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\82\92宣è¨\80ã\81\99ã\82\8bã\81«ã\81¯ã\80\81`Form`ã\82\92使ç\94¨ã\81\99ã\82\8b。
+ã\83\95ã\82©ã\83¼ã\83 ã\83\87ã\83¼ã\82¿ã\81®å\85¥å\8a\9bã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\82\92宣è¨\80ã\81\99ã\82\8bã\81«ã\81¯ã\80\81`Form`ã\82\92使ç\94¨ã\81\97ã\81¾ã\81\99。
# レスポンスステータスコード { #response-status-code }
+
レスポンスモデルを指定するのと同じ方法で、レスポンスに使用されるHTTPステータスコードを以下の*path operations*のいずれかの`status_code`パラメータで宣言することもできます。
* `@app.get()`
# リクエストのExampleデータの宣言 { #declare-request-example-data }
+
アプリが受け取れるデータの例を宣言できます。
ここでは、それを行ういくつかの方法を紹介します。
* ユーザーがフロントエンドでクリックして、フロントエンドのWebアプリの別のセクションに移動します。
* フロントエンドはAPIからさらにデータを取得する必要があります。
* しかし、特定のエンドポイントの認証が必要です。
- * したがって、APIで認証するため、HTTPヘッダー`Authorization`に`Bearer`の文字列とトークンを加えた値を送信します。
+ * したがって、APIで認証するため、HTTPヘッダー`Authorization`に`Bearer `の文字列とトークンを加えた値を送信します。
* トークンに`foobar`が含まれている場合、`Authorization`ヘッダーの内容は次のようになります: `Bearer foobar`。
## **FastAPI**の`OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer }
/// note | 技術詳細
-**FastAPI**は、`OAuth2PasswordBearer` クラス (依存関係で宣言されている) を使用してOpenAPIのセキュリティスキームを定義できることを知っています。これは`fastapi.security.oauth2.OAuth2`、`fastapi.security.base.SecurityBase`を継承しているからです。
+**FastAPI**は、`OAuth2PasswordBearer` クラス (依存関係で宣言されている) を使用してOpenAPIのセキュリティスキームを定義できることを知っています。これは、このクラスが`fastapi.security.oauth2.OAuth2`を継承しており、さらにそれが`fastapi.security.base.SecurityBase`を継承しているからです。
OpenAPIと統合するセキュリティユーティリティ (および自動APIドキュメント) はすべて`SecurityBase`を継承しています。それにより、**FastAPI**はそれらをOpenAPIに統合する方法を知ることができます。
ボディを宣言するのにPydanticを使用するのと同じやり方で、Pydanticを別のどんなところでも使うことができます:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## 依存関係 `get_current_user` を作成 { #create-a-get-current-user-dependency }
# パスワード(およびハッシュ化)によるOAuth2、JWTトークンによるBearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
-これでセキュリティの流れが全てわかったので、<abbr title="JSON Web Tokens - JSON Web Token">JWT</abbr>トークンと安全なパスワードのハッシュ化を使用して、実際にアプリケーションを安全にしてみましょう。
+これでセキュリティの流れが全てわかったので、<abbr title="JSON Web Tokens - JSON Webトークン">JWT</abbr>トークンと安全なパスワードのハッシュ化を使用して、実際にアプリケーションを安全にしてみましょう。
このコードは、アプリケーションで実際に使用したり、パスワードハッシュをデータベースに保存するといった用途に利用できます。
RSAやECDSAのようなデジタル署名アルゴリズムを使用する予定がある場合は、cryptographyライブラリの依存関係`pyjwt[crypto]`をインストールしてください。
-詳細は[PyJWT Installation docs](https://pyjwt.readthedocs.io/en/latest/installation.html)で確認できます。
+詳細は[PyJWT インストールに関するドキュメント](https://pyjwt.readthedocs.io/en/latest/installation.html)で確認できます。
///
`authenticate_user` がデータベースに存在しないユーザー名で呼び出された場合でも、ダミーのハッシュを使って `verify_password` を実行します。
-これにより、ユーザー名が有効かどうかに関わらずエンドポイントの応答時間がおおよそ同じになり、既存のユーザー名を列挙するために悪用されうる「タイミング攻撃」を防止できます。
+これにより、ユーザー名が有効かどうかに関わらずエンドポイントの応答時間がおおよそ同じになり、既存のユーザー名を列挙するために悪用されうる**タイミング攻撃**を防止できます。
/// note | 備考
/// tip | 豆知識
-コードのどこにも平文のパスワード"`secret`"はなく、ハッシュ化されたものしかないことを確認してください。
+コードのどこにも平文のパスワード「`secret`」はなく、ハッシュ化されたものしかないことを確認してください。
///
また、データベースのモデルでは任意の別名を使って構いません。
-しかし、ログイン用の path operation では、仕様との互換性を保つ(たとえば組み込みのAPIドキュメントシステムを使えるようにする)ために、これらの名前を使う必要があります。
+しかし、ログイン用の *path operation* では、仕様との互換性を保つ(たとえば組み込みのAPIドキュメントシステムを使えるようにする)ために、これらの名前を使う必要があります。
また、仕様では `username` と `password` はフォームデータとして送らなければならない(つまり、ここではJSONは使わない)ことも定められています。
### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }
-まず、`OAuth2PasswordRequestForm` をインポートし、`/token` の path operation に `Depends` で依存関係として使います:
+まず、`OAuth2PasswordRequestForm` をインポートし、`/token` の *path operation* に `Depends` で依存関係として使います:
{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}
`UserInDB(**user_dict)` は次を意味します:
-`user_dict` のキーと値を、そのままキーワード引数として渡します。つまり次と同等です:
+*`user_dict` のキーと値を、そのままキーワード引数として渡します。つまり次と同等です:*
```Python
UserInDB(
/// note | 備考
-`**user_dict` のより完全な解説は、[**追加モデル**のドキュメント](../extra-models.md#about-user-in-dict)を参照してください。
+`**user_dict` のより完全な解説は、[**追加モデル**のドキュメント](../extra-models.md#about-user-in-model-dump)を参照してください。
///
アクティブなユーザーの場合にのみ `current_user` を取得したいとします。
-そこで、`get_current_active_user` を依存関係として利用する追加の依存関係 `get_current_active_user` を作成します。
+そこで、今度は `get_current_user` を依存関係として利用する追加の依存関係 `get_current_active_user` を作成します。
これら2つの依存関係は、ユーザーが存在しない、または非アクティブである場合に、HTTPエラーを返すだけです。
### 自分のユーザーデータを取得 { #get-your-own-user-data }
-`GET` の path `/users/me` を使います。
+今度は path `/users/me` で operation `GET` を使います。
次のようなユーザーデータが取得できます:
Password: `secret2`
-そして `GET` の path `/users/me` を使います。
+そして path `/users/me` で operation `GET` を使ってみます。
次のような「Inactive user」エラーになります:
これらの道具を使えば、任意のデータベース、任意のユーザー/データモデルと互換性のあるセキュリティシステムを構築できます。
-ただし、実際にはまだ「安全」ではありません。
+唯一欠けている点は、実際にはまだ「安全」ではないことです。
次の章では、安全なパスワードハッシュライブラリと <abbr title="JSON Web Tokens - JSON Web Token">JWT</abbr> トークンの使い方を見ていきます。
# SQL(リレーショナル)データベース { #sql-relational-databases }
+
FastAPI は SQL(リレーショナル)データベースの使用を必須にはしません。必要であれば、任意のデータベースを使用できます。
ここでは [SQLModel](https://sqlmodel.tiangolo.com/) を使った例を見ていきます。
`StaticFiles` を使用して、ディレクトリから静的ファイルを自動的に提供できます。
+/// tip | 豆知識
+
+フロントエンドをホストする必要がある場合は、代わりに `app.frontend()` を使用してください。詳しくは [フロントエンド](frontend.md) を読んでください。
+
+`app.frontend()` は内部で `StaticFiles` を使用しており、client-side routing の処理など、フロントエンド向けの追加の利点がいくつかあります。
+
+///
+
## `StaticFiles` の使用 { #use-staticfiles }
* `StaticFiles` をインポート。
`TestClient` をインポートします。
-`TestClient` を作成し、**FastAPI** に渡します。
+**FastAPI** アプリケーションを渡して `TestClient` を作成します。
`test_` から始まる名前の関数を作成します (これは `pytest` の標準的なコンベンションです)。
/// tip | 豆知識
-FastAPIアプリケーションへのリクエストの送信とは別に、テストで `async` 関数 (非同期データベース関数など) を呼び出したい場合は、高度なチュートリアルの[Async Tests](../advanced/async-tests.md) を参照してください。
+FastAPIアプリケーションへのリクエストの送信とは別に、テストで `async` 関数 (非同期データベース関数など) を呼び出したい場合は、高度なチュートリアルの[非同期テスト](../advanced/async-tests.md) を参照してください。
///
### **FastAPI** アプリファイル { #fastapi-app-file }
-[Bigger Applications](bigger-applications.md) で説明されている、次のようなファイル構成があるとします:
+[大規模なアプリケーション](bigger-applications.md) で説明されている、次のようなファイル構成があるとします:
```
.
│ └── test_main.py
```
-ここで、**FastAPI** アプリがある `main.py` ファイルには、他の path operation があります。
+ここで、**FastAPI** アプリがある `main.py` ファイルには、他の **path operations** がいくつかあります。
エラーを返す可能性のある `GET` オペレーションがあります。
<div class="termy">
```console
-// Go to the home directory
+// ホームディレクトリに移動
$ cd
-// Create a directory for all your code projects
+// すべてのコードプロジェクト用のディレクトリを作成
$ mkdir code
-// Enter into that code directory
+// その code ディレクトリに入る
$ cd code
-// Create a directory for this project
+// このプロジェクト用のディレクトリを作成
$ mkdir awesome-project
-// Enter into that project directory
+// そのプロジェクトディレクトリに入る
$ cd awesome-project
```