Sync fastapi docs from 7cb06f36 on 2026-07-11
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
# LLM テストファイル { #llm-test-file }
|
||||
|
||||
|
||||
このドキュメントは、ドキュメントを翻訳する <abbr title="Large Language Model - 大規模言語モデル">LLM</abbr> が、`scripts/translate.py` の `general_prompt` と、`docs/{language code}/llm-prompt.md` の言語固有プロンプトを理解しているかをテストします。言語固有プロンプトは `general_prompt` の末尾に追加されます。
|
||||
|
||||
ここに追加したテストは、すべての言語固有プロンプトの設計者が参照します。
|
||||
|
||||
@@ -34,7 +34,7 @@ FastAPI はそのモデルから JSON Schema を生成し、OpenAPI の適切な
|
||||
|
||||
///
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`model` キーは OpenAPI の一部ではありません。
|
||||
|
||||
@@ -183,7 +183,7 @@ FastAPI はそこから Pydantic モデルを取得して JSON Schema を生成
|
||||
|
||||
///
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`responses` パラメータで明示的に別のメディアタイプを指定しない限り、FastAPI はレスポンスがメインのレスポンスクラスと同じメディアタイプ(デフォルトは `application/json`)であるとみなします。
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
|
||||
|
||||
/// warning
|
||||
/// warning | 注意
|
||||
|
||||
上の例のように `Response` を直接返すと、それはそのまま返されます。
|
||||
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
|
||||
ただし、その固定の内容はパラメータ化できるようにしたいです。
|
||||
|
||||
## "callable" なインスタンス { #a-callable-instance }
|
||||
## 「callable」なインスタンス { #a-callable-instance }
|
||||
|
||||
Python には、クラスのインスタンスを "callable" にする方法があります。
|
||||
Python には、クラスのインスタンスを「callable」にする方法があります。
|
||||
|
||||
クラス自体(これはすでに callable です)ではなく、そのクラスのインスタンスです。
|
||||
|
||||
@@ -98,7 +98,7 @@ FastAPI 0.118.0 より前では、`yield` を使う依存関係を使用する
|
||||
|
||||
この挙動は 0.118.0 で元に戻され、`yield` の後の終了コードはレスポンス送信後に実行されるようになりました。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
以下で見るように、これはバージョン 0.106.0 より前の挙動ととても似ていますが、いくつかのコーナーケースに対する改良とバグ修正が含まれています。
|
||||
|
||||
@@ -146,7 +146,7 @@ FastAPI 0.110.0 より前では、`yield` を持つ依存関係を使い、そ
|
||||
|
||||
FastAPI 0.106.0 より前では、`yield` の後で例外を送出することはできませんでした。`yield` を持つ依存関係の終了コードはレスポンス送信「後」に実行されるため、[例外ハンドラ](../tutorial/handling-errors.md#install-custom-exception-handlers)はすでに実行済みでした。
|
||||
|
||||
これは主に、依存関係が "yield" した同じオブジェクトをバックグラウンドタスク内で利用できるようにするための設計でした。終了コードはバックグラウンドタスク完了後に実行されるからです。
|
||||
これは主に、依存関係が「yield」した同じオブジェクトをバックグラウンドタスク内で利用できるようにするための設計でした。終了コードはバックグラウンドタスク完了後に実行されるからです。
|
||||
|
||||
これは、レスポンスがネットワーク上を移動するのを待っている間にリソースを保持しないようにする意図で、FastAPI 0.106.0 で変更されました。
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ FastAPI はデフォルトでJSONレスポンスを返します。
|
||||
|
||||
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
パラメータ `response_class` は、レスポンスの「メディアタイプ」を定義するためにも使用されます。
|
||||
|
||||
@@ -65,7 +65,7 @@ FastAPI はデフォルトでJSONレスポンスを返します。
|
||||
|
||||
///
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
もちろん、実際の `Content-Type` ヘッダーやステータスコードなどは、返した `Response` オブジェクトに由来します。
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ FastAPI は **Pydantic** の上に構築されており、これまでにリク
|
||||
|
||||
これは Pydantic モデルの場合と同じように動作します。内部的にも同様に Pydantic を使って実現されています。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
dataclasses は、Pydantic モデルができることをすべては行えない点に留意してください。
|
||||
|
||||
@@ -74,7 +74,7 @@ dataclass は自動的に Pydantic の dataclass に変換されます。
|
||||
|
||||
いつもどおり、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 自体は返さず、内部データを持つ辞書のリストを返しています。
|
||||
|
||||
@@ -82,7 +82,7 @@ dataclass は自動的に Pydantic の dataclass に変換されます。
|
||||
|
||||
`dataclasses` は他の型注釈と多様な組み合わせが可能で、複雑なデータ構造を構成できます。
|
||||
|
||||
上記のコード内コメントのヒントを参照して、より具体的な詳細を確認してください。
|
||||
上記のコード内の注釈のヒントを参照して、より具体的な詳細を確認してください。
|
||||
|
||||
## さらに学ぶ { #learn-more }
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ async with lifespan(app):
|
||||
|
||||
ここでは、`shutdown` のイベントハンドラ関数が、テキスト行 `"Application shutdown"` をファイル `log.txt` に書き込みます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`open()` 関数の `mode="a"` は「追加」(append)を意味します。つまり、そのファイルに既にある内容を上書きせず、行が後ろに追記されます。
|
||||
|
||||
@@ -140,7 +140,7 @@ async with lifespan(app):
|
||||
|
||||
### `startup` と `shutdown` をまとめて { #startup-and-shutdown-together }
|
||||
|
||||
起動時とシャットダウン時のロジックは関連していることが多いです。何かを開始してから終了したい、リソースを獲得してから解放したい、などです.
|
||||
起動時とシャットダウン時のロジックは関連していることが多いです。何かを開始してから終了したい、リソースを獲得してから解放したい、などです。
|
||||
|
||||
共有するロジックや変数のない別々の関数でそれを行うのは難しく、グローバル変数などに値を保存する必要が出てきます。
|
||||
|
||||
@@ -152,7 +152,7 @@ async with lifespan(app):
|
||||
|
||||
内部的には、ASGI の技術仕様において、これは [Lifespan プロトコル](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) の一部であり、`startup` と `shutdown` というイベントが定義されています。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
Starlette の `lifespan` ハンドラについては、[Starlette の Lifespan ドキュメント](https://www.starlette.dev/lifespan/)で詳しく読むことができます。
|
||||
|
||||
|
||||
@@ -20,21 +20,6 @@ FastAPI は自動的に **OpenAPI 3.1** の仕様を生成します。したが
|
||||
|
||||
///
|
||||
|
||||
## 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)
|
||||
* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
|
||||
|
||||
これらのソリューションの中にはオープンソースや無料枠を提供するものもあり、金銭的コミットメントなしで試すことができます。他の商用 SDK ジェネレータも存在し、オンラインで見つけられます。🤓
|
||||
|
||||
## TypeScript SDK を作成する { #create-a-typescript-sdk }
|
||||
|
||||
まずは簡単な FastAPI アプリから始めます:
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## 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 でエンコードされた文字列のみを含められるため、生のバイト列は含められません。
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
* API 利用者(外部開発者)に通知を送り返します。
|
||||
* これは(あなたの API から)外部開発者が提供する *外部 API* に POST リクエストを送ることで行われます(これが「コールバック」です)。
|
||||
|
||||
## 通常の FastAPI アプリ { #the-normal-fastapi-app }
|
||||
## 通常の **FastAPI** アプリ { #the-normal-fastapi-app }
|
||||
|
||||
まず、コールバックを追加する前の通常の API アプリがどうなるか見てみましょう。
|
||||
|
||||
@@ -76,7 +76,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
|
||||
|
||||
しかし、あなたはすでに **FastAPI** で API の自動ドキュメントを簡単に作る方法を知っています。
|
||||
|
||||
その知識を使って、*外部 API* がどうあるべきかをドキュメント化します……つまり、外部 API が実装すべき *path operation(s)*(あなたの API が呼び出すもの)を作成します。
|
||||
その知識を使って、*外部 API* がどうあるべきかをドキュメント化します... つまり、外部 API が実装すべき *path operation(s)*(あなたの API が呼び出すもの)を作成します。
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
@@ -86,13 +86,13 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
|
||||
|
||||
///
|
||||
|
||||
### コールバック用 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* を作成します。
|
||||
|
||||
@@ -167,13 +167,13 @@ JSON ボディは次のような内容です:
|
||||
|
||||
これで、上で作成したコールバック用ルーター内に、必要なコールバックの *path operation(s)*(*外部開発者* が *外部 API* に実装すべきもの)が用意できました。
|
||||
|
||||
次に、*あなたの API の path operation デコレータ*の `callbacks` パラメータに、そのコールバック用ルーターの属性 `.routes`(実体はルート/*path operations* の `list`)を渡します:
|
||||
次に、*あなたの API の path operation デコレータ*の `callbacks` パラメータに、そのコールバック用ルーターの属性 `.routes` を渡します:
|
||||
|
||||
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
`callback=` に渡すのはルーター本体(`invoices_callback_router`)ではなく、属性 `.routes`(`invoices_callback_router.routes`)である点に注意してください。
|
||||
`callbacks=` に渡すのはルーター本体(`invoices_callback_router`)ではなく、属性 `.routes`(`invoices_callback_router.routes`)である点に注意してください。FastAPI はそれらのルートを使ってコールバックの OpenAPI ドキュメントを生成します。
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ Webhook の URL を登録する方法や実際にリクエストを送るコー
|
||||
|
||||
これにより、ユーザーがあなたの **Webhook** リクエストを受け取るための**API を実装**するのが大幅に簡単になります。場合によっては、ユーザーが自分たちの API コードを自動生成できるかもしれません。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
Webhook は OpenAPI 3.1.0 以上で利用可能で、FastAPI `0.99.0` 以上が対応しています。
|
||||
|
||||
@@ -36,7 +36,7 @@ Webhook は OpenAPI 3.1.0 以上で利用可能で、FastAPI `0.99.0` 以上が
|
||||
|
||||
定義した webhook は **OpenAPI** スキーマおよび自動生成される **ドキュメント UI** に反映されます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`app.webhooks` オブジェクトは実際には単なる `APIRouter` で、複数ファイルでアプリを構成する際に使うものと同じ型です。
|
||||
|
||||
|
||||
@@ -16,17 +16,11 @@ OpenAPIの「エキスパート」でなければ、これはおそらく必要
|
||||
|
||||
### *path operation関数* の名前をoperationIdとして使用する { #using-the-path-operation-function-name-as-the-operationid }
|
||||
|
||||
APIの関数名を `operationId` として利用したい場合、すべてのAPI関数をイテレーションし、各 *path operation* の `operation_id` を `APIRoute.name` で上書きすれば可能です。
|
||||
API の関数名を `operationId` として使いたい場合は、`FastAPI` にカスタムの `generate_unique_id_function` を渡せます。
|
||||
|
||||
すべての *path operation* を追加した後に行うべきです。
|
||||
この関数は各 `APIRoute` を受け取り、その *path operation* で使う `operationId` を返します。
|
||||
|
||||
{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
`app.openapi()` を手動で呼び出す場合、その前に `operationId` を更新するべきです。
|
||||
|
||||
///
|
||||
{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
|
||||
|
||||
/// warning | 注意
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# レスポンス - ステータスコードの変更 { #response-change-status-code }
|
||||
|
||||
|
||||
すでに、デフォルトの[レスポンスのステータスコード](../tutorial/response-status-code.md)を設定できることをご存知かもしれません。
|
||||
|
||||
しかし場合によっては、デフォルトとは異なるステータスコードを返す必要があります。
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# レスポンスの Cookie { #response-cookies }
|
||||
|
||||
|
||||
## `Response` パラメータを使う { #use-a-response-parameter }
|
||||
|
||||
*path operation 関数*で `Response` 型のパラメータを宣言できます。
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
実際は、`Response` やそのサブクラスを返すことができます。
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
`JSONResponse` それ自体は、`Response` のサブクラスです。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# レスポンスヘッダー { #response-headers }
|
||||
|
||||
|
||||
## `Response` パラメータを使う { #use-a-response-parameter }
|
||||
|
||||
(Cookie と同様に)*path operation 関数*で `Response` 型のパラメータを宣言できます。
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# OAuth2 のスコープ { #oauth2-scopes }
|
||||
|
||||
|
||||
OAuth2 のスコープは **FastAPI** で直接利用でき、シームレスに統合されています。
|
||||
|
||||
これにより、OAuth2 標準に従った、よりきめ細かな権限システムを、OpenAPI 対応アプリケーション(および API ドキュメント)に統合できます。
|
||||
@@ -46,7 +47,7 @@ OpenAPI(例: API ドキュメント)では、「セキュリティスキー
|
||||
- `instagram_basic` は Facebook / Instagram で使われています。
|
||||
- `https://www.googleapis.com/auth/drive` は Google で使われています。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
OAuth2 において「スコープ」は、必要な特定の権限を宣言する単なる文字列です。
|
||||
|
||||
@@ -126,7 +127,7 @@ OAuth2 にとっては、単に文字列に過ぎません。
|
||||
|
||||
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
|
||||
|
||||
/// info | 技術詳細
|
||||
/// note | 技術詳細
|
||||
|
||||
`Security` は実際には `Depends` のサブクラスで、後述する追加パラメータが 1 つあるだけです。
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ Pydantic から `BaseSettings` をインポートして、そのサブクラス
|
||||
|
||||
Pydantic モデルと同様に、型アノテーションと(必要なら)デフォルト値を持つクラス属性を宣言します。
|
||||
|
||||
`Field()` による追加バリデーションなど、Pydantic モデルで使えるのと同じバリデーション機能をすべて利用できます。
|
||||
異なるデータ型や `Field()` による追加バリデーションなど、Pydantic モデルで使えるのと同じバリデーション機能とツールをすべて利用できます。
|
||||
|
||||
{* ../../docs_src/settings/tutorial001_py310.py hl[2,5:8,11] *}
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
JSON として構造化できるデータをストリームしたい場合は、[JSON Lines をストリームする](../tutorial/stream-json-lines.md) を参照してください。
|
||||
|
||||
しかし、純粋なバイナリデータや文字列をストリームしたい場合は、次のようにできます。
|
||||
しかし、**純粋なバイナリデータ**や文字列をストリームしたい場合は、次のようにできます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
FastAPI 0.134.0 で追加されました。
|
||||
|
||||
@@ -12,21 +12,21 @@ 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` を使えます。
|
||||
|
||||
@@ -40,7 +40,7 @@ FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し
|
||||
|
||||
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
|
||||
|
||||
つまり、`StreamingResponse` では型アノテーションに依存せず、送信したい形式に合わせてバイト列を生成・エンコードする「自由」と「責任」があなたにあります。 🤓
|
||||
つまり、`StreamingResponse` では型アノテーションに依存せず、送信したい形式に合わせてバイト列を生成・エンコードする**自由**と**責任**があなたにあります。 🤓
|
||||
|
||||
### バイト列をストリームする { #stream-bytes }
|
||||
|
||||
@@ -58,7 +58,7 @@ FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し
|
||||
|
||||
{* ../../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] *}
|
||||
|
||||
@@ -90,7 +90,7 @@ FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し
|
||||
|
||||
また、多くの場合、ディスクやネットワークから読み出すため、読み取りはブロッキング(イベントループをブロックし得る)処理になります。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
上記の例は例外で、`io.BytesIO` は既にメモリ上にあるため、読み取りが何かをブロックすることはありません。
|
||||
|
||||
@@ -98,7 +98,7 @@ FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し
|
||||
|
||||
///
|
||||
|
||||
イベントループのブロッキングを避けるには、path operation 関数を `async def` ではなく通常の `def` で宣言してください。そうすると FastAPI はその関数をスレッドプールワーカー上で実行し、メインループのブロッキングを避けます。
|
||||
イベントループのブロッキングを避けるには、*path operation 関数*を `async def` ではなく通常の `def` で宣言してください。そうすると FastAPI はその関数をスレッドプールワーカー上で実行し、メインループのブロッキングを避けます。
|
||||
|
||||
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
|
||||
|
||||
この設定では、`Content-Type` ヘッダーがないリクエストでもボディが JSON として解析されます。これは古いバージョンの FastAPI と同じ挙動です。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
この挙動と設定は FastAPI 0.132.0 で追加されました。
|
||||
|
||||
|
||||
@@ -111,7 +111,7 @@ WebSocketエンドポイントでは、`fastapi` から以下をインポート
|
||||
|
||||
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
これはWebSocketであるため、`HTTPException` を発生させることはあまり意味がありません。代わりに `WebSocketException` を発生させます。
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
# WSGI の組み込み - Flask、Django など { #including-wsgi-flask-django-others }
|
||||
|
||||
|
||||
[サブアプリケーション - マウント](sub-applications.md)、[プロキシの背後](behind-a-proxy.md) で見たように、WSGI アプリケーションをマウントできます。
|
||||
|
||||
そのために `WSGIMiddleware` を使用して、Flask や Django などの WSGI アプリをラップできます。
|
||||
|
||||
## `WSGIMiddleware` の使用 { #using-wsgimiddleware }
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
これには `a2wsgi` のインストールが必要です。例: `pip install a2wsgi`。
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ Requestsは非常にシンプルかつ直感的なデザインで使いやすく
|
||||
response = requests.get("http://example.com/some/url")
|
||||
```
|
||||
|
||||
対応するFastAPIのAPIのpath operationはこのようになります:
|
||||
対応するFastAPI側のAPI *path operation* はこのようになります:
|
||||
|
||||
```Python hl_lines="1"
|
||||
@app.get("/some/url")
|
||||
@@ -96,12 +96,12 @@ def read_url():
|
||||
return {"message": "Hello World"}
|
||||
```
|
||||
|
||||
`requests.get(...)` と`@app.get(...)` には類似点が見受けられます。
|
||||
`requests.get(...)` と`@app.get(...)` には類似点が見受けられます。
|
||||
|
||||
/// tip | **FastAPI**へ与えたインスピレーション
|
||||
|
||||
* シンプルで直感的なAPIを持っている点。
|
||||
* HTTPメソッド名を直接利用し、単純で直感的である。
|
||||
* HTTPメソッド名 (operation) を直接利用し、単純で直感的である。
|
||||
* 適切なデフォルト値を持ちつつ、強力なカスタマイズ性を持っている。
|
||||
|
||||
///
|
||||
@@ -223,7 +223,7 @@ Flask、Flask-apispec、Marshmallow、Webargsの組み合わせは、**FastAPI**
|
||||
* [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 | 備考
|
||||
|
||||
@@ -247,7 +247,7 @@ Angular 2にインスピレーションを受けた、統合された依存性
|
||||
|
||||
パラメータはTypeScriptの型で記述されるので (Pythonの型ヒントに似ています) 、エディタのサポートはとても良いです。
|
||||
|
||||
しかし、TypeScriptのデータはJavaScriptへのコンパイル後には残されないため、バリデーション、シリアライゼーション、ドキュメント化を同時に定義するのに型に頼ることはできません。そのため、バリデーション、シリアライゼーション、スキーマの自動生成を行うためには、多くの場所でデコレータを追加する必要があり、非常に冗長になります。
|
||||
しかし、TypeScriptのデータはJavaScriptへのコンパイル後には残されないため、バリデーション、シリアライゼーション、ドキュメント化を同時に定義するのに型に頼ることはできません。このことといくつかの設計上の判断により、バリデーション、シリアライゼーション、スキーマの自動生成を行うためには、多くの場所でデコレータを追加する必要があり、非常に冗長になります。
|
||||
|
||||
入れ子になったモデルをうまく扱えません。そのため、リクエストのJSONボディが内部フィールドを持つJSONオブジェクトで、それが順番にネストされたJSONオブジェクトになっている場合、適切にドキュメント化やバリデーションをすることができません。
|
||||
|
||||
@@ -333,15 +333,15 @@ OpenAPIやJSON Schemaのような標準に基づいたものではありませ
|
||||
|
||||
同じフレームワークを使って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**へ与えたインスピレーション
|
||||
/// tip | **FastAPI**にインスピレーションを与えたアイデア
|
||||
|
||||
HugはAPIStarに部分的なインスピレーションを与えており、私が発見した中ではAPIStarと同様に最も期待の持てるツールの一つでした。
|
||||
|
||||
@@ -430,7 +430,7 @@ Starletteは、軽量な<dfn title="非同期Python Webアプリケーション
|
||||
* インプロセスのバックグラウンドタスク。
|
||||
* 起動およびシャットダウンイベント。
|
||||
* HTTPXに基づいて構築されたテストクライアント。
|
||||
* CORS、GZip、静的ファイル、ストリーミング応答。
|
||||
* CORS、GZip、静的ファイル、ストリーミングレスポンス。
|
||||
* セッションとクッキーのサポート。
|
||||
* 100%のテストカバレッジ。
|
||||
* 100%の型注釈付きコードベース。
|
||||
@@ -480,6 +480,6 @@ Starletteや**FastAPI**のサーバーとして推奨されています。
|
||||
|
||||
///
|
||||
|
||||
## ベンチマーク と スピード { #benchmarks-and-speed }
|
||||
## ベンチマークと速度 { #benchmarks-and-speed }
|
||||
|
||||
Uvicorn、Starlette、FastAPIの違いを理解、比較、確認するには、[ベンチマーク](benchmarks.md)を確認してください。
|
||||
|
||||
@@ -215,7 +215,7 @@ def results():
|
||||
|
||||
この「並列ハンバーガー」のシナリオでは、あなたは 2 つのプロセッサ (あなたと好きな人) を持つコンピュータ/プログラム 🤖 で、どちらも長い間 🕙「カウンターでの待機」に注意 ⏯ を専念しています。
|
||||
|
||||
ファストフード店には 8 個のプロセッサ (レジ係/料理人) があります。一方、並行ハンバーガーの店には (レジ係 1、人、料理人 1 人の) 2 個しかなかったかもしれません。
|
||||
ファストフード店には 8 個のプロセッサ (レジ係/料理人) があります。一方、並行ハンバーガーの店には (レジ係 1 人、料理人 1 人の) 2 個しかなかったかもしれません。
|
||||
|
||||
それでも、最終的な体験は最良とは言えません。😞
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ FastAPI アプリケーションは、実質的にどのようなクラウドプ
|
||||
|
||||
## FastAPI Cloud { #fastapi-cloud }
|
||||
|
||||
**[FastAPI Cloud](https://fastapicloud.com)** は、**FastAPI** の作者と同じチームによって作られています。
|
||||
**[FastAPI Cloud](https://fastapicloud.com)** は、**FastAPI** の作者および同じチームによって作られています。
|
||||
|
||||
API の**構築**、**デプロイ**、**アクセス**までのプロセスを、最小限の手間で効率化します。
|
||||
|
||||
@@ -16,7 +16,7 @@ FastAPI Cloud は、*FastAPI and friends* オープンソースプロジェク
|
||||
|
||||
## クラウドプロバイダ - スポンサー { #cloud-providers-sponsors }
|
||||
|
||||
他にもいくつかのクラウドプロバイダが ✨ [**FastAPI をスポンサーしています**](../help-fastapi.md#sponsor-the-author) ✨。🙇
|
||||
他にもいくつかのクラウドプロバイダが ✨ [**FastAPI をスポンサーしています**](https://github.com/sponsors/tiangolo) ✨。🙇
|
||||
|
||||
それらのガイドを参考にし、サービスを試してみるのもよいでしょう:
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# デプロイメントのコンセプト { #deployments-concepts }
|
||||
|
||||
**FastAPI**を用いたアプリケーションをデプロイするとき、もしくはどのようなタイプのWeb APIであっても、おそらく気になるコンセプトがいくつかあります。
|
||||
|
||||
それらを活用することでアプリケーションを**デプロイするための最適な方法**を見つけることができます。
|
||||
**FastAPI**を用いたアプリケーションをデプロイするとき、もしくはどのようなタイプのWeb APIであっても、おそらく気になるコンセプトがいくつかあり、それらを活用することでアプリケーションを**デプロイするための最適な方法**を見つけることができます。
|
||||
|
||||
重要なコンセプトのいくつかを紹介します:
|
||||
|
||||
@@ -17,9 +15,7 @@
|
||||
|
||||
最終的な目的は、**安全な方法で**APIクライアントに**サービスを提供**し、**中断を回避**するだけでなく、**計算リソース**(例えばリモートサーバー/仮想マシン)を可能な限り効率的に使用することです。 🚀
|
||||
|
||||
この章では前述した**コンセプト**についてそれぞれ説明します。
|
||||
|
||||
この説明を通して、普段とは非常に異なる環境や存在しないであろう**将来の**環境に対し、デプロイの方法を決める上で必要な**直感**を与えてくれることを願っています。
|
||||
ここではこれらの**コンセプト**についてもう少し説明します。それによって、普段とは非常に異なる環境や存在しないであろう**将来の**環境に対し、APIのデプロイ方法を決める上で必要な**直感**を与えてくれることを願っています。
|
||||
|
||||
これらのコンセプトを意識することにより、**あなた自身のAPI**をデプロイするための最適な方法を**評価**し、**設計**することができるようになるでしょう。
|
||||
|
||||
@@ -31,11 +27,12 @@
|
||||
|
||||
[前チャプターのHTTPSについて](https.md)では、HTTPSがどのようにAPIを暗号化するのかについて学びました。
|
||||
|
||||
通常、アプリケーションサーバにとって**外部の**コンポーネントである**TLS Termination Proxy**によって提供されることが一般的です。このプロキシは通信の暗号化を担当します。
|
||||
また、HTTPSは通常、アプリケーションサーバにとって**外部の**コンポーネントである**TLS Termination Proxy**によって提供されることも確認しました。
|
||||
|
||||
さらに、HTTPS証明書の更新を担当するものが必要で、同じコンポーネントが担当することもあれば、別のコンポーネントが担当することもあります。
|
||||
さらに、**HTTPS証明書の更新**を担当するものが必要で、同じコンポーネントが担当することもあれば、別のコンポーネントが担当することもあります。
|
||||
|
||||
### HTTPS 用ツールの例 { #example-tools-for-https }
|
||||
|
||||
TLS Termination Proxyとして使用できるツールには以下のようなものがあります:
|
||||
|
||||
* Traefik
|
||||
@@ -148,17 +145,17 @@ FastAPIでWeb APIを構築する際に、コードにエラーがある場合、
|
||||
|
||||
しかしながら、**アプリケーション全体をクラッシュさせるようなコードを書いて**UvicornとPythonをクラッシュさせるようなケースもあるかもしれません。💥
|
||||
|
||||
それでも、ある箇所でエラーが発生したからといって、アプリケーションを停止させたままにしたくないでしょう。 少なくとも壊れていない*path operation*については、**実行し続けたい**はずです。
|
||||
それでも、ある箇所でエラーが発生したからといって、アプリケーションを停止させたままにしたくないでしょう。 少なくとも壊れていない*path operations*については、**実行し続けたい**はずです。
|
||||
|
||||
### クラッシュ後の再起動 { #restart-after-crash }
|
||||
|
||||
しかし、実行中の**プロセス**をクラッシュさせるような本当にひどいエラーの場合、少なくとも2〜3回ほどプロセスを**再起動**させる外部コンポーネントが必要でしょう。
|
||||
しかし、実行中の**プロセス**をクラッシュさせるような本当にひどいエラーの場合、少なくとも2〜3回ほどプロセスを**再起動**させる外部コンポーネントが必要でしょう...
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
...とはいえ、アプリケーション全体が**すぐにクラッシュする**のであれば、いつまでも再起動し続けるのは意味がないでしょう。しかし、その場合はおそらく開発中か少なくともデプロイ直後に気づくと思われます。
|
||||
|
||||
そこで、**将来**クラッシュする可能性があり、それでも再スタートさせることに意味があるような、主なケースに焦点を当ててみます。
|
||||
そこで、**将来**特定のケースで完全にクラッシュする可能性があり、それでも再スタートさせることに意味があるような、主なケースに焦点を当ててみます。
|
||||
|
||||
///
|
||||
|
||||
@@ -207,9 +204,7 @@ FastAPI アプリケーションでは、Uvicorn を実行する `fastapi` コ
|
||||
|
||||
### サーバーメモリ { #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をロードしようとすると問題が発生します。🚨
|
||||
|
||||
@@ -233,9 +228,7 @@ FastAPI アプリケーションでは、Uvicorn を実行する `fastapi` コ
|
||||
|
||||
これを実現するにはいくつかのアプローチがありますが、具体的な戦略については次の章(Dockerやコンテナの章など)で詳しく説明します。
|
||||
|
||||
考慮すべき主な制約は、**パブリックIP**の**ポート**を処理する**単一の**コンポーネントが存在しなければならないということです。
|
||||
|
||||
そして、レプリケートされた**プロセス/ワーカー**に通信を**送信**する方法を持つ必要があります。
|
||||
考慮すべき主な制約は、**パブリックIP**の**ポート**を処理する**単一の**コンポーネントが存在しなければならないということです。そして、レプリケートされた**プロセス/ワーカー**に通信を**送信**する方法を持つ必要があります。
|
||||
|
||||
考えられる組み合わせと戦略をいくつか紹介します:
|
||||
|
||||
@@ -243,7 +236,7 @@ FastAPI アプリケーションでは、Uvicorn を実行する `fastapi` コ
|
||||
* 1つのUvicornの**プロセスマネージャー**が**IP**と**ポート**をリッスンし、**複数のUvicornワーカー・プロセス**を起動する。
|
||||
* **Kubernetes**やその他の分散**コンテナ・システム**
|
||||
* **Kubernetes**レイヤーの何かが**IP**と**ポート**をリッスンする。レプリケーションは、**複数のコンテナ**にそれぞれ**1つのUvicornプロセス**を実行させることで行われる。
|
||||
* **クラウド・サービス**によるレプリケーション
|
||||
* これを代わりに処理する**クラウド・サービス**
|
||||
* クラウド・サービスはおそらく**あなたのためにレプリケーションを処理**します。**実行するプロセス**や使用する**コンテナイメージ**を定義できるかもしれませんが、いずれにせよ、それはおそらく**単一のUvicornプロセス**であり、クラウドサービスはそのレプリケーションを担当するでしょう。
|
||||
|
||||
/// tip | 豆知識
|
||||
@@ -264,9 +257,7 @@ FastAPI アプリケーションでは、Uvicorn を実行する `fastapi` コ
|
||||
|
||||
そのため、アプリケーションを開始する前の**事前のステップ**を実行する**単一のプロセス**を用意したいと思われます。
|
||||
|
||||
そして、それらの事前のステップを実行しているのが単一のプロセスであることを確認する必要があります。このことはその後アプリケーション自体のために**複数のプロセス**(複数のワーカー)を起動した場合も同様です。
|
||||
|
||||
これらのステップが**複数のプロセス**によって実行された場合、**並列**に実行されることによって作業が**重複**することになります。そして、もしそのステップがデータベースのマイグレーションのような繊細なものであった場合、互いに競合を引き起こす可能性があります。
|
||||
そして、それらの事前のステップを実行しているのが単一のプロセスであることを確認する必要があります。これはその後アプリケーション自体のために**複数のプロセス**(複数のワーカー)を起動した場合も同様です。これらのステップが**複数のプロセス**によって実行された場合、**並列**に実行されることによって作業が**重複**することになります。そして、もしそのステップがデータベースのマイグレーションのような繊細なものであった場合、互いに競合を引き起こす可能性があります。
|
||||
|
||||
もちろん、事前のステップを何度も実行しても問題がない場合もあり、その際は対処がかなり楽になります。
|
||||
|
||||
@@ -284,7 +275,7 @@ FastAPI アプリケーションでは、Uvicorn を実行する `fastapi` コ
|
||||
|
||||
考えられるアイデアをいくつか挙げてみます:
|
||||
|
||||
* アプリコンテナの前に実行されるKubernetesのInitコンテナ
|
||||
* アプリコンテナの前に実行されるKubernetesの「Init Container」
|
||||
* 事前のステップを実行し、アプリケーションを起動するbashスクリプト
|
||||
* 利用するbashスクリプトを起動/再起動したり、エラーを検出したりする方法は以前として必要になるでしょう。
|
||||
|
||||
@@ -296,7 +287,7 @@ FastAPI アプリケーションでは、Uvicorn を実行する `fastapi` コ
|
||||
|
||||
## リソースの利用 { #resource-utilization }
|
||||
|
||||
あなたのサーバーは**リソース**であり、プログラムを実行しCPUの計算時間や利用可能なRAMメモリを消費または**利用**することができます。
|
||||
あなたのサーバーは(複数の場合も)**リソース**であり、プログラムを実行しCPUの計算時間や利用可能なRAMメモリを消費または**利用**することができます。
|
||||
|
||||
システムリソースをどれくらい消費/利用したいですか? 「少ない方が良い」と考えるのは簡単かもしれないですが、実際には、**クラッシュせずに可能な限り**最大限に活用したいでしょう。
|
||||
|
||||
@@ -309,11 +300,9 @@ FastAPI アプリケーションでは、Uvicorn を実行する `fastapi` コ
|
||||
|
||||
この場合、**1つ余分なサーバー**を用意し、その上でいくつかのプロセスを実行し、すべてのサーバーが**十分なRAMとCPU時間を持つようにする**のがよいでしょう。
|
||||
|
||||
また、何らかの理由でAPIの利用が急増する可能性もあります。もしかしたらそれが流行ったのかもしれないし、他のサービスやボットが使い始めたのかもしれないです。そのような場合に備えて、余分なリソースを用意しておくと安心でしょう。
|
||||
また、何らかの理由でAPIの利用が**急増**する可能性もあります。もしかしたらそれが流行ったのかもしれないし、他のサービスやボットが使い始めたのかもしれないです。そのような場合に備えて、余分なリソースを用意しておくと安心でしょう。
|
||||
|
||||
例えば、リソース使用率の**50%から90%の範囲**で**任意の数字**をターゲットとすることができます。
|
||||
|
||||
重要なのは、デプロイメントを微調整するためにターゲットを設定し測定することが、おそらく使用したい主要な要素であることです。
|
||||
例えば、リソース使用率の**50%から90%の範囲**で**任意の数字**をターゲットとすることができます。重要なのは、デプロイメントを微調整するために測定して使用したい主要な要素は、おそらくそれらであるということです。
|
||||
|
||||
`htop`のような単純なツールを使って、サーバーで使用されているCPUやRAM、あるいは各プロセスで使用されている量を見ることができます。あるいは、より複雑な監視ツールを使って、サーバに分散して使用することもできます。
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ Linuxコンテナの使用には、**セキュリティ**、**反復可能性(
|
||||
///
|
||||
|
||||
<details>
|
||||
<summary>Dockerfile Preview 👀</summary>
|
||||
<summary>Dockerfile プレビュー 👀</summary>
|
||||
|
||||
```Dockerfile
|
||||
FROM python:3.14
|
||||
@@ -26,7 +26,7 @@ COPY ./app /code/app
|
||||
|
||||
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"]
|
||||
```
|
||||
|
||||
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
|
||||
|
||||
</div>
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
パッケージの依存関係を定義しインストールするためのフォーマットやツールは他にもあります。
|
||||
|
||||
@@ -243,14 +243,14 @@ Docker命令 [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) は2つ
|
||||
✅ **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
|
||||
```
|
||||
|
||||
@@ -340,7 +340,7 @@ $ docker build -t myimage .
|
||||
|
||||
///
|
||||
|
||||
### Dockerコンテナの起動する { #start-the-docker-container }
|
||||
### Dockerコンテナを起動する { #start-the-docker-container }
|
||||
|
||||
* イメージに基づいてコンテナを実行します:
|
||||
|
||||
@@ -417,7 +417,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
|
||||
|
||||
コンテナという観点から、[デプロイのコンセプト](concepts.md)に共通するいくつかについて、もう一度説明しましょう。
|
||||
|
||||
コンテナは主に、アプリケーションの**ビルドとデプロイ**のプロセスを簡素化するためのツールですが、これらの**デプロイのコンセプト**を扱うための特定のアプローチを強制するものではなく、いくつかの戦略があります。
|
||||
コンテナは主に、アプリケーションの**ビルドとデプロイ**のプロセスを簡素化するための工具ですが、これらの**デプロイのコンセプト**を扱うための特定のアプローチを強制するものではなく、いくつかの戦略があります。
|
||||
|
||||
**良いニュース**は、それぞれの異なる戦略には、すべてのデプロイメントのコンセプトをカバーする方法があるということです。🎉
|
||||
|
||||
@@ -562,7 +562,7 @@ Docker Composeで**単一サーバ**(クラスタではない)にデプロ
|
||||
|
||||
複数の**コンテナ**があり、おそらくそれぞれが**単一のプロセス**を実行している場合(例えば、**Kubernetes**クラスタなど)、レプリケートされたワーカーコンテナを実行する**前に**、単一のコンテナで**事前のステップ**の作業を行う**別のコンテナ**を持ちたいと思うでしょう。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
もしKubernetesを使用している場合, これはおそらく[Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)でしょう。
|
||||
|
||||
|
||||
@@ -1,26 +1,6 @@
|
||||
# FastAPI Cloud { #fastapi-cloud }
|
||||
|
||||
[FastAPI Cloud](https://fastapicloud.com) に **コマンド1つ** でデプロイできます。まだならウェイティングリストにご登録ください。🚀
|
||||
|
||||
## ログイン { #login }
|
||||
|
||||
すでに **FastAPI Cloud** アカウントをお持ちであることを確認してください(ウェイティングリストからご招待しています 😉)。
|
||||
|
||||
次にログインします:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi login
|
||||
|
||||
You are logged in to FastAPI Cloud 🚀
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
## デプロイ { #deploy }
|
||||
|
||||
では、**コマンド1つ** でアプリをデプロイします:
|
||||
[FastAPI Cloud](https://fastapicloud.com) に **コマンド1つ** で FastAPI アプリをデプロイできます。🚀
|
||||
|
||||
<div class="termy">
|
||||
|
||||
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
|
||||
|
||||
</div>
|
||||
|
||||
CLI は FastAPI アプリケーションを自動検出してクラウドにデプロイします。ログインしていない場合は、認証を完了するためにブラウザが開きます。
|
||||
|
||||
以上です!その URL からアプリにアクセスできます。✨
|
||||
|
||||
## FastAPI Cloud について { #about-fastapi-cloud }
|
||||
|
||||
@@ -43,7 +43,6 @@ TLS Termination Proxyとして使えるオプションには、以下のよう
|
||||
* Nginx
|
||||
* HAProxy
|
||||
|
||||
|
||||
## Let's Encrypt { #lets-encrypt }
|
||||
|
||||
Let's Encrypt以前は、これらの**HTTPS証明書**は信頼できる第三者によって販売されていました。
|
||||
@@ -100,11 +99,9 @@ TLS接続を確立するためのクライアントとサーバー間のこの
|
||||
|
||||
### SNI拡張機能付きのTLS { #tls-with-sni-extension }
|
||||
|
||||
サーバー内の**1つのプロセス**だけが、特定の**IPアドレス**の特定の**ポート**で待ち受けることができます。
|
||||
サーバー内の**1つのプロセス**だけが、特定の**IPアドレス**の特定の**ポート**で待ち受けることができます。同じIPアドレスの他のポートで他のプロセスがリッスンしている可能性もありますが、IPアドレスとポートの組み合わせごとに1つだけです。
|
||||
|
||||
同じIPアドレスの他のポートで他のプロセスがリッスンしている可能性もありますが、IPアドレスとポートの組み合わせごとに1つだけです。
|
||||
|
||||
TLS(HTTPS)はデフォルトで`443`という特定のポートを使用する。つまり、これが必要なポートです。
|
||||
TLS(HTTPS)はデフォルトで`443`という特定のポートを使用します。つまり、これが必要なポートです。
|
||||
|
||||
このポートをリクエストできるのは1つのプロセスだけなので、これを実行するプロセスは**TLS Termination Proxy**となります。
|
||||
|
||||
@@ -120,9 +117,9 @@ TLS Termination Proxyは、1つ以上の**TLS証明書**(HTTPS証明書)に
|
||||
|
||||
次に証明書を使用して、クライアントとTLS Termination Proxy は、 **TCP通信**の残りを**どのように暗号化するかを決定**します。これで**TLSハンドシェイク**の部分が完了します。
|
||||
|
||||
この後、クライアントとサーバーは**暗号化されたTCP接続**を持ちます。そして、その接続を使って実際の**HTTP通信**を開始することができます。
|
||||
この後、クライアントとサーバーは**暗号化されたTCP接続**を持ちます。これがTLSの提供するものです。そして、その接続を使って実際の**HTTP通信**を開始することができます。
|
||||
|
||||
これが**HTTPS**であり、純粋な(暗号化されていない)TCP接続ではなく、**セキュアなTLS接続**の中に**HTTP**があるだけです。
|
||||
これが**HTTPS**であり、純粋な(暗号化されていない)TCP接続ではなく、**セキュアなTLS接続**の中に単なる**HTTP**があるだけです。
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
@@ -152,7 +149,7 @@ TLS Termination Proxy は、合意が取れている暗号化を使用して、*
|
||||
|
||||
### HTTPS レスポンス { #https-response }
|
||||
|
||||
TLS Termination Proxyは次に、事前に合意が取れている暗号(`someapp.example.com`の証明書から始まる)を使って**レスポンスを暗号化し**、ブラウザに送り返す。
|
||||
TLS Termination Proxyは次に、事前に合意が取れている暗号(`someapp.example.com`の証明書から始まる)を使って**レスポンスを暗号化し**、ブラウザに送り返します。
|
||||
|
||||
その後ブラウザでは、レスポンスが有効で正しい暗号キーで暗号化されていることなどを検証します。そして、ブラウザはレスポンスを**復号化**して処理します。
|
||||
|
||||
@@ -191,7 +188,6 @@ TLS Termination Proxyは次に、事前に合意が取れている暗号(`someap
|
||||
* これは、同じ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 }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# サーバーを手動で実行する { #run-a-server-manually }
|
||||
|
||||
## fastapi run コマンドを使う { #use-the-fastapi-run-command }
|
||||
## `fastapi run` コマンドを使う { #use-the-fastapi-run-command }
|
||||
|
||||
結論として、FastAPI アプリケーションを提供するには `fastapi run` を使います:
|
||||
|
||||
@@ -56,7 +56,6 @@ FastAPI は、Python の Web フレームワークとサーバーのための標
|
||||
* [Hypercorn](https://hypercorn.readthedocs.io/): HTTP/2 や Trio に対応する ASGI サーバーなど。
|
||||
* [Daphne](https://github.com/django/daphne): Django Channels のために作られた ASGI サーバー。
|
||||
* [Granian](https://github.com/emmett-framework/granian): Python アプリケーション向けの Rust 製 HTTP サーバー。
|
||||
* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): 軽量で多用途な Web アプリケーションランタイム。
|
||||
|
||||
## サーバーマシンとサーバープログラム { #server-machine-and-server-program }
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
ここでは、`fastapi` コマンド、または `uvicorn` コマンドを直接使って、**ワーカープロセス**付きの **Uvicorn** を使う方法を紹介します。
|
||||
|
||||
/// info | 情報
|
||||
/// note
|
||||
|
||||
DockerやKubernetesなどのコンテナを使用している場合は、次の章で詳しく説明します: [コンテナ内のFastAPI - Docker](docker.md)。
|
||||
|
||||
|
||||
@@ -20,4 +20,4 @@
|
||||
- **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」のウォークスルーを選んでください。
|
||||
|
||||
@@ -163,7 +163,7 @@ Hello World from Python
|
||||
|
||||
つまり、環境変数からPythonで読み取る**あらゆる値**は **`str`になり**、他の型への変換やバリデーションはコード内で行う必要があります。
|
||||
|
||||
環境変数を使って**アプリケーション設定**を扱う方法については、[高度なユーザーガイド - Settings and Environment Variables](./advanced/settings.md)で詳しく学べます。
|
||||
環境変数を使って**アプリケーション設定**を扱う方法については、[高度なユーザーガイド - 設定と環境変数](./advanced/settings.md)で詳しく学べます。
|
||||
|
||||
## `PATH`環境変数 { #path-environment-variable }
|
||||
|
||||
@@ -285,7 +285,7 @@ $ C:\opt\custompython\bin\python
|
||||
|
||||
////
|
||||
|
||||
この情報は、[Virtual Environments](virtual-environments.md)について学ぶ際にも役立ちます。
|
||||
この情報は、[仮想環境](virtual-environments.md)について学ぶ際にも役立ちます。
|
||||
|
||||
## まとめ { #conclusion }
|
||||
|
||||
@@ -295,4 +295,4 @@ $ C:\opt\custompython\bin\python
|
||||
|
||||
多くの場合、環境変数がどのように役立ち、すぐに適用できるのかはあまり明確ではありません。しかし、開発中のさまざまなシナリオで何度も登場するため、知っておくとよいでしょう。
|
||||
|
||||
例えば、次のセクションの[Virtual Environments](virtual-environments.md)でこの情報が必要になります。
|
||||
例えば、次のセクションの[仮想環境](virtual-environments.md)でこの情報が必要になります。
|
||||
|
||||
@@ -99,7 +99,7 @@ Python 開発者調査では、[最もよく使われる機能の 1 つが「オ
|
||||
|
||||
すべてに妥当な **デフォルト** があり、どこでもオプションで構成できます。必要に応じてすべてのパラメータを微調整して、求める API を定義できます。
|
||||
|
||||
しかしデフォルトのままでも、すべて **うまく動きます**。
|
||||
しかしデフォルトのままでも、すべて **「うまく動きます」**。
|
||||
|
||||
### 検証 { #validation }
|
||||
|
||||
@@ -140,7 +140,7 @@ FastAPI には、非常に使いやすく、かつ非常に強力な <dfn title=
|
||||
|
||||
* 依存関係は依存関係を持つこともでき、階層または **依存関係の「グラフ」** を作成できます。
|
||||
* すべてフレームワークによって**自動的に処理**されます。
|
||||
* すべての依存関係はリクエストからデータを要求でき、*path operation* の制約と自動ドキュメントを**拡張**できます。
|
||||
* すべての依存関係はリクエストからデータを要求でき、path operation の制約と自動ドキュメントを**拡張**できます。
|
||||
* 依存関係で定義された *path operation* のパラメータについても**自動検証**されます。
|
||||
* 複雑なユーザー認証システム、**データベース接続** などのサポート。
|
||||
* **データベースやフロントエンド等との妥協は不要**。すべてと簡単に統合できます。
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# ヘルプ { #help }
|
||||
|
||||
|
||||
FastAPI を手助けしたい、または FastAPI についてヘルプが必要ですか?
|
||||
|
||||
応援したりヘルプを得たりする簡単な方法がいくつかあります。
|
||||
|
||||
@@ -67,4 +67,4 @@ presets: [
|
||||
|
||||
これらは文字列ではなく **JavaScript** のオブジェクトであるため、Python のコードから直接渡すことはできません。
|
||||
|
||||
そのような JavaScript 専用の設定を使う必要がある場合は、上記のいずれかの方法を使用し、Swagger UI の path operation をオーバーライドして、必要な JavaScript を手動で記述してください。
|
||||
そのような JavaScript 専用の設定を使う必要がある場合は、上記のいずれかの方法を使用できます。Swagger UI の *path operation* 全体をオーバーライドして、必要な JavaScript を手動で記述してください。
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
これは「上級」機能です。
|
||||
|
||||
FastAPI を始めたばかりの場合は、このセクションは読み飛ばしてもよいでしょう。
|
||||
**FastAPI** を始めたばかりの場合は、このセクションは読み飛ばしてもよいでしょう。
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -25,9 +25,17 @@
|
||||
- `openapi_version`: 使用する OpenAPI 仕様のバージョン。デフォルトは最新の `3.1.0`。
|
||||
- `summary`: API の短い概要。
|
||||
- `description`: API の説明。Markdown を含めることができ、ドキュメントに表示されます。
|
||||
- `routes`: ルートのリスト。登録済みの各 path operation です。`app.routes` から取得されます。
|
||||
- `routes`: アプリケーションのルート。`app.routes` から取得されます。FastAPI はこれらを使用して、登録済みの path operation(取り込んだルーター由来のものも含む)を収集します。
|
||||
|
||||
/// info | 情報
|
||||
/// tip | 技術詳細
|
||||
|
||||
`app.routes` はより低レベルなルートツリーです。最終的な `APIRoute` オブジェクトだけでなく、FastAPI が内部で使用する、取り込まれたルーター向けの候補ルートも含まれることがあります。
|
||||
|
||||
それでも `app.routes` を `get_openapi()` に渡せます。FastAPI はそのルートツリーを走査して、有効な path operation を収集します。
|
||||
|
||||
///
|
||||
|
||||
/// note | 備考
|
||||
|
||||
パラメータ `summary` は OpenAPI 3.1.0 以降で利用可能で、FastAPI 0.99.0 以降が対応しています。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# GraphQL { #graphql }
|
||||
|
||||
|
||||
**FastAPI** は **ASGI** 標準に基づいているため、ASGI に対応した任意の **GraphQL** ライブラリを簡単に統合できます。
|
||||
|
||||
同じアプリケーション内で通常の FastAPI の *path operation* と GraphQL を組み合わせて使えます。
|
||||
|
||||
@@ -8,6 +8,8 @@ FastAPI 0.119.0 では、Pydantic v2 内からの Pydantic v1 の部分的サポ
|
||||
|
||||
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 のサポートを終了しました。
|
||||
@@ -54,6 +56,16 @@ Pydantic v2 には、Pydantic v1 がサブモジュール `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` サブモジュールに切り替えるだけで、多くの場合そのまま動作します。
|
||||
@@ -122,6 +134,12 @@ Pydantic v1 のモデルで `Body`、`Query`、`Form` などの FastAPI 固有
|
||||
|
||||
### 段階的に移行 { #migrate-in-steps }
|
||||
|
||||
/// warning | 注意
|
||||
|
||||
以下で説明する、同じアプリ内で Pydantic v1 と v2 のモデルを併用する段階的移行は、**FastAPI 0.119.0 から 0.127.x** でのみ動作します。これは **FastAPI 0.128.0** で削除され、最新バージョンでは **Pydantic v2** モデルが必要です。
|
||||
|
||||
///
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
まずは `bump-pydantic` を試してください。テストが通り、問題なければコマンド一発で完了です。✨
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
|
||||
その場合は、**FastAPI** のパラメータ `separate_input_output_schemas=False` でこの機能を無効化できます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`separate_input_output_schemas` のサポートは FastAPI `0.102.0` で追加されました。🤓
|
||||
|
||||
|
||||
+13
-13
@@ -49,15 +49,15 @@ FastAPI は、Python の標準である型ヒントに基づいて Python で AP
|
||||
* **簡単**: 簡単に利用・習得できるようにデザインされています。ドキュメントを読む時間を削減します。
|
||||
* **短い**: コードの重複を最小限にします。各パラメータ宣言から複数の機能を得られます。バグも減ります。
|
||||
* **堅牢性**: 自動対話型ドキュメントにより、本番環境向けのコードが得られます。
|
||||
* **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 -%}
|
||||
@@ -65,7 +65,7 @@ FastAPI は、Python の標準である型ヒントに基づいて Python で AP
|
||||
{% endfor -%}
|
||||
</div>
|
||||
|
||||
### Gold Sponsors { #gold-sponsors }
|
||||
### Gold スポンサー { #gold-sponsors }
|
||||
|
||||
<div class="fastapi-sponsors fastapi-sponsors--gold">
|
||||
{% for sponsor in sponsors.gold -%}
|
||||
@@ -73,7 +73,7 @@ FastAPI は、Python の標準である型ヒントに基づいて Python で AP
|
||||
{% endfor -%}
|
||||
</div>
|
||||
|
||||
### Silver Sponsors { #silver-sponsors }
|
||||
### Silver スポンサー { #silver-sponsors }
|
||||
|
||||
<div class="fastapi-sponsors fastapi-sponsors--silver">
|
||||
{% for sponsor in sponsors.silver -%}
|
||||
@@ -125,7 +125,7 @@ FastAPI は、Python の標準である型ヒントに基づいて Python で AP
|
||||
|
||||
<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>
|
||||
|
||||
@@ -275,7 +275,7 @@ INFO: Application startup complete.
|
||||
</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) を使用してサーバーを起動します。
|
||||
|
||||
@@ -471,11 +471,11 @@ item: Item
|
||||
|
||||
...に変更し、エディタが属性を自動補完し、その型を知ることを確認してください。
|
||||
|
||||

|
||||

|
||||
|
||||
より多くの機能を含む、より完全な例については、<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` のような **検証制約** を設定する方法。
|
||||
@@ -492,9 +492,7 @@ item: Item
|
||||
|
||||
### アプリをデプロイ(任意) { #deploy-your-app-optional }
|
||||
|
||||
必要に応じて FastAPI アプリを [FastAPI Cloud](https://fastapicloud.com) にデプロイできます。まだの場合はウェイティングリストに参加してください。 🚀
|
||||
|
||||
すでに **FastAPI Cloud** アカウント(ウェイティングリストから招待されました 😉)がある場合は、1 コマンドでアプリケーションをデプロイできます。
|
||||
1 コマンドで FastAPI アプリを [FastAPI Cloud](https://fastapicloud.com) にデプロイできます。 🚀
|
||||
|
||||
<div class="termy">
|
||||
|
||||
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
|
||||
|
||||
</div>
|
||||
|
||||
CLI は自動的に FastAPI アプリケーションを検出し、クラウドへデプロイします。ログインしていない場合は、認証を完了するためにブラウザが開きます。
|
||||
|
||||
これで完了です!その URL でアプリにアクセスできます。 ✨
|
||||
|
||||
#### FastAPI Cloud について { #about-fastapi-cloud }
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
テンプレートは通常、特定のセットアップが含まれていますが、柔軟でカスタマイズできるように設計されています。これにより、プロジェクトの要件に合わせて変更・適応でき、優れた出発点になります。🏁
|
||||
|
||||
このテンプレートを使って開始できます。初期セットアップ、セキュリティ、データベース、いくつかのAPIエンドポイントがすでに用意されています。
|
||||
このテンプレートを使って開始できます。初期セットアップの多く、セキュリティ、データベース、いくつかのAPIエンドポイントがすでに用意されています。
|
||||
|
||||
GitHubリポジトリ: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template)
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ def some_function(data: Any):
|
||||
|
||||
一部の型は、角括弧内で「型パラメータ」を受け取り、内部の型を定義できます。例えば「文字列のリスト」は `list[str]` として宣言します。
|
||||
|
||||
このように型パラメータを取れる型は **Generic types**(ジェネリクス)と呼ばれます。
|
||||
このように型パラメータを取れる型は **Generic types** または **Generics**(ジェネリクス)と呼ばれます。
|
||||
|
||||
次の組み込み型をジェネリクスとして(角括弧と内部の型で)使えます:
|
||||
|
||||
@@ -265,7 +265,7 @@ def some_function(data: Any):
|
||||
|
||||
これは「`one_person` はクラス `Person` の **インスタンス** である」ことを意味します。
|
||||
|
||||
「`one_person` は `Person` という名前の **クラ ス** である」という意味ではありません。
|
||||
「`one_person` は `Person` という名前の **クラス** である」という意味ではありません。
|
||||
|
||||
## Pydantic のモデル { #pydantic-models }
|
||||
|
||||
@@ -343,6 +343,6 @@ Python 自体は、この `Annotated` で何かをするわけではありませ
|
||||
|
||||
/// note | 備考
|
||||
|
||||
すでにすべてのチュートリアルを終えて、型についての詳細を見るためにこのページに戻ってきた場合は、良いリソースとして [`mypy` の「チートシート`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) があります。
|
||||
すでにすべてのチュートリアルを終えて、型についての詳細を見るためにこのページに戻ってきた場合は、良いリソースとして [`mypy` の「チートシート」](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) があります。
|
||||
|
||||
///
|
||||
|
||||
@@ -17,16 +17,16 @@ Flask 出身であれば、Flask の Blueprint に相当します。
|
||||
```
|
||||
.
|
||||
├── 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 | 豆知識
|
||||
@@ -396,9 +396,9 @@ from .routers.users import router
|
||||
|
||||
/// note | 技術詳細
|
||||
|
||||
実際には、`APIRouter` で宣言された各 *path operation* ごとに内部的に *path operation* が作成されます。
|
||||
FastAPI は、ルーターをメインアプリに取り込んだ後も、元の `APIRouter` とその `APIRoute` を有効なまま保持します。
|
||||
|
||||
つまり裏側では、すべてが同じ単一のアプリであるかのように動作します。
|
||||
そのため、カスタムの `APIRouter` や `APIRoute` のサブクラスも、取り込み後に引き続き機能します。
|
||||
|
||||
///
|
||||
|
||||
@@ -406,7 +406,7 @@ from .routers.users import router
|
||||
|
||||
ルーターを取り込んでもパフォーマンスを心配する必要はありません。
|
||||
|
||||
これは起動時にマイクロ秒で行われます。
|
||||
これは軽量に設計され、各リクエストにオーバーヘッドを追加しないようになっています。
|
||||
|
||||
したがってパフォーマンスには影響しません。⚡
|
||||
|
||||
@@ -461,7 +461,7 @@ from .routers.users import router
|
||||
|
||||
これは、それらの *path operations* を OpenAPI スキーマやユーザーインターフェースに含めたいからです。
|
||||
|
||||
完全に分離して独立に「マウント」できないため、*path operations* は直接取り込まれるのではなく「クローン(再作成)」されます。
|
||||
FastAPI は元のルーターと *path operations* を有効なまま保持し、リクエスト処理や OpenAPI 生成の際に、ルーターの prefix、dependencies、tags、responses、その他のメタデータを組み合わせます。
|
||||
|
||||
///
|
||||
|
||||
@@ -532,4 +532,16 @@ $ fastapi dev
|
||||
router.include_router(other_router)
|
||||
```
|
||||
|
||||
`router` を `FastAPI` アプリに取り込む前にこれを実行して、`other_router` の *path operations* も含まれるようにしてください。
|
||||
これは、`router` を `FastAPI` アプリに取り込む前でも後でも実行できます。FastAPI は `other_router` の *path operations* をルーティングと OpenAPI に含めます。
|
||||
|
||||
同様に、後からルーターに追加された *path operations* も、以前の取り込みを通して見えるようになります。
|
||||
|
||||
/// warning | 注意
|
||||
|
||||
`router` を取り込んだ後に、`router.routes` を直接ミューテートするのは避けてください。FastAPI はルーターの取り込みをライブとして扱うため、元のルーターとそのルートはルーティングと OpenAPI 生成の一部のままです。
|
||||
|
||||
ルートやルーターを追加するには、path operation デコレータや `.include_router()` などのドキュメント化された API を使用してください。
|
||||
|
||||
`router.routes` は、ルート定義や取り込まれたルーターを含みうる低レベルのルートツリーとして扱い、最終的な *path operations* のフラットな一覧として当てにしないでください。
|
||||
|
||||
///
|
||||
|
||||
@@ -110,7 +110,7 @@ q: str | None = None
|
||||
|
||||
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`Body`もまた、後述する `Query` や `Path` などと同様に、すべての追加検証パラメータとメタデータパラメータを持っています。
|
||||
|
||||
@@ -125,7 +125,7 @@ Pydanticモデル`Item`の単一の`item`ボディパラメータしかないと
|
||||
しかし、追加のボディパラメータを宣言したときのように、キー `item` を持つ JSON と、その中のモデル内容を期待したい場合は、特別な `Body` パラメータ `embed` を使うことができます:
|
||||
|
||||
```Python
|
||||
item: Item = Body(embed=True)
|
||||
item: Annotated[Item, Body(embed=True)]
|
||||
```
|
||||
|
||||
以下において:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# ボディ - ネストされたモデル { #body-nested-models }
|
||||
|
||||
|
||||
**FastAPI** を使用すると、深くネストされた任意のモデルを定義、検証、文書化、使用することができます(Pydanticのおかげです)。
|
||||
|
||||
## リストのフィールド { #list-fields }
|
||||
@@ -135,8 +136,7 @@ Pydanticモデルを`list`や`set`などのサブタイプとして使用する
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`images`キーが画像オブジェクトのリストを持つようになったことに注目してください。
|
||||
|
||||
@@ -148,7 +148,7 @@ Pydanticモデルを`list`や`set`などのサブタイプとして使用する
|
||||
|
||||
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`Offer`は`Item`のリストであり、それらがさらにオプションの`Image`のリストを持っていることに注目してください。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# リクエストボディ { #request-body }
|
||||
|
||||
|
||||
クライアント(例えばブラウザ)からAPIにデータを送信する必要がある場合、**リクエストボディ**として送信します。
|
||||
|
||||
**リクエスト**ボディは、クライアントからAPIへ送信されるデータです。**レスポンス**ボディは、APIがクライアントに送信するデータです。
|
||||
@@ -8,7 +9,7 @@ APIはほとんどの場合 **レスポンス** ボディを送信する必要
|
||||
|
||||
**リクエスト**ボディを宣言するには、[Pydantic](https://docs.pydantic.dev/) モデルを使用し、その強力な機能とメリットをすべて利用します。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
データを送信するには、`POST`(より一般的)、`PUT`、`DELETE`、`PATCH` のいずれかを使用すべきです。
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<img src="/img/tutorial/cookie-param-models/image01.png">
|
||||
</div>
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
**ブラウザがクッキーを処理し**ていますが、特別な方法で内部的に処理を行っているために、**JavaScript**からは簡単に操作**できない**ことに留意してください。
|
||||
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
|
||||
///
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
クッキーを宣言するには、`Cookie`を使う必要があります。なぜなら、そうしないとパラメータがクエリのパラメータとして解釈されてしまうからです。
|
||||
|
||||
///
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
**ブラウザがクッキーを**特殊な方法で裏側で扱うため、**JavaScript** から簡単には触れられないことを念頭に置いてください。
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ from myapp import app
|
||||
|
||||
---
|
||||
|
||||
Pycharmを使用する場合、次のことが可能です:
|
||||
PyCharmを使用する場合、次のことが可能です:
|
||||
|
||||
* 「実行」メニューをオープン。
|
||||
* オプション「デバッグ...」を選択。
|
||||
|
||||
@@ -28,11 +28,11 @@
|
||||
|
||||
///
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
この例では、架空のカスタムヘッダー `X-Key` と `X-Token` を使用しています。
|
||||
|
||||
しかし実際のケースでセキュリティを実装する際は、統合された[Security utilities(次の章)](../security/index.md)を使うことで、より多くの利点を得られます。
|
||||
しかし実際のケースでセキュリティを実装する際は、統合された[セキュリティユーティリティ(次の章)](../security/index.md)を使うことで、より多くの利点を得られます。
|
||||
|
||||
///
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
## *path operation*のグループに対する依存関係 { #dependencies-for-a-group-of-path-operations }
|
||||
|
||||
後で、より大きなアプリケーションを(おそらく複数ファイルで)構造化する方法([Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md))について読むときに、*path operation*のグループに対して単一の`dependencies`パラメータを宣言する方法を学びます。
|
||||
後で、より大きなアプリケーションを(おそらく複数ファイルで)構造化する方法([より大きなアプリケーション - 複数ファイル](../../tutorial/bigger-applications.md))について読むときに、*path operation*のグループに対して単一の`dependencies`パラメータを宣言する方法を学びます。
|
||||
|
||||
## グローバル依存関係 { #global-dependencies }
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@ participant tasks as Background tasks
|
||||
end
|
||||
```
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
**1つのレスポンス** だけがクライアントに送信されます。それはエラーレスポンスの一つかもしれませんし、*path operation*からのレスポンスかもしれません。
|
||||
|
||||
@@ -234,6 +234,7 @@ participant operation as Path Operation
|
||||
`yield`を持つ依存関係は、さまざまなユースケースをカバーし、いくつかの問題を修正するために、時間とともに進化してきました。
|
||||
|
||||
FastAPIの異なるバージョンで何が変わったのかを知りたい場合は、上級ガイドの[上級の依存関係 - `yield`、`HTTPException`、`except`、バックグラウンドタスクを持つ依存関係](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)で詳しく読めます。
|
||||
|
||||
## コンテキストマネージャ { #context-managers }
|
||||
|
||||
### 「コンテキストマネージャ」とは { #what-are-context-managers }
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
そして、これらの値を含む`dict`を返します。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(そして推奨し始めました)。
|
||||
|
||||
@@ -106,7 +106,7 @@ common_parameters --> read_users
|
||||
|
||||
この方法では、共有されるコードを一度書き、**FastAPI** が*path operation*のための呼び出しを行います。
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
特別なクラスを作成してどこかで **FastAPI** に渡して「登録」する必要はないことに注意してください。
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
*path operation 関数*の中で宣言している依存関係は`query_or_cookie_extractor`の1つだけであることに注意してください。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# 追加データ型 { #extra-data-types }
|
||||
|
||||
|
||||
今まで、以下のような一般的なデータ型を使用してきました:
|
||||
|
||||
* `int`
|
||||
|
||||
@@ -208,4 +208,4 @@ some_variable: PlaneItem | CarItem
|
||||
|
||||
複数のPydanticモデルを使用し、ケースごとに自由に継承します。
|
||||
|
||||
エンティティが異なる「状態」を持たなければならない場合は、エンティティごとに単一のデータモデルを持つ必要はありません。`password`、`password_hash`、パスワードなしを含む状態を持つユーザー「エンティティ」の場合と同様です。
|
||||
エンティティが異なる「状態」を持たなければならない場合は、エンティティごとに単一のデータモデルを持つ必要はありません。`password`、`password_hash`、パスワードなしを含む状態を持つ**ユーザー**「エンティティ」の場合と同様です。
|
||||
|
||||
@@ -78,7 +78,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
|
||||
次に、[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)によって提供):
|
||||
|
||||

|
||||
|
||||
@@ -104,7 +104,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
|
||||
#### OpenAPIおよびJSONスキーマ { #openapi-and-json-schema }
|
||||
|
||||
OpenAPIはAPIのためのAPIスキーマを定義します。そして、そのスキーマは**JSONデータスキーマ**の標準規格である**JSON Schema**を利用するAPIによって送受されるデータの定義(または「スキーマ」)を含んでいます。
|
||||
OpenAPIはAPIのためのAPIスキーマを定義します。そして、そのスキーマには、JSONデータスキーマの標準である**JSON Schema**を使用して、APIによって送受信されるデータの定義(または「スキーマ」)が含まれます。
|
||||
|
||||
#### `openapi.json`を確認 { #check-the-openapi-json }
|
||||
|
||||
@@ -180,7 +180,7 @@ entrypoint = "backend.main:app"
|
||||
from backend.main import app
|
||||
```
|
||||
|
||||
### パス付きの`fastapi dev` { #fastapi-dev-with-path }
|
||||
### パス指定の`fastapi dev`または`--entrypoint` CLIオプション { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
|
||||
|
||||
`fastapi dev`コマンドにファイルパスを渡すこともでき、使用すべきFastAPIのappオブジェクトを推測します:
|
||||
|
||||
@@ -188,29 +188,19 @@ from backend.main import app
|
||||
$ fastapi dev main.py
|
||||
```
|
||||
|
||||
ただし、その場合は毎回`fastapi`コマンドを呼ぶたびに正しいパスを渡すことを覚えておく必要があります。
|
||||
または、`fastapi dev`コマンドに`--entrypoint`オプションを渡すこともできます:
|
||||
|
||||
```console
|
||||
$ fastapi dev --entrypoint main:app
|
||||
```
|
||||
|
||||
ただし、その場合は毎回`fastapi`コマンドを呼ぶたびに正しいパスや`entrypoint`を渡すことを覚えておく必要があります。
|
||||
|
||||
さらに、他のツール(たとえば、[VS Code 拡張機能](../editor-support.md)や[FastAPI Cloud](https://fastapicloud.com))が見つけられない場合があります。そのため、`pyproject.toml`の`entrypoint`を使うことを推奨します。
|
||||
|
||||
### アプリをデプロイ(任意) { #deploy-your-app-optional }
|
||||
|
||||
任意でFastAPIアプリを[FastAPI Cloud](https://fastapicloud.com)にデプロイできます。まだなら、待機リストに登録してください。 🚀
|
||||
|
||||
すでに**FastAPI Cloud**アカウントがある場合(待機リストから招待済みの場合😉)、1コマンドでアプリケーションをデプロイできます。
|
||||
|
||||
デプロイする前に、ログインしていることを確認してください:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi login
|
||||
|
||||
You are logged in to FastAPI Cloud 🚀
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
その後、アプリをデプロイします:
|
||||
任意でFastAPIアプリを[FastAPI Cloud](https://fastapicloud.com)に1コマンドでデプロイできます。 🚀
|
||||
|
||||
<div class="termy">
|
||||
|
||||
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
|
||||
|
||||
</div>
|
||||
|
||||
CLIはFastAPIアプリケーションを自動検出してクラウドにデプロイします。ログインしていない場合、認証を完了するためにブラウザが開きます。
|
||||
|
||||
以上です!これで、そのURLでアプリにアクセスできます。 ✨
|
||||
|
||||
## ステップ毎の要約 { #recap-step-by-step }
|
||||
@@ -247,6 +239,7 @@ Deploying to FastAPI Cloud...
|
||||
### Step 2: `FastAPI`の「インスタンス」を生成 { #step-2-create-a-fastapi-instance }
|
||||
|
||||
{* ../../docs_src/first_steps/tutorial001_py310.py hl[3] *}
|
||||
|
||||
ここで、`app`変数が`FastAPI`クラスの「インスタンス」になります。
|
||||
|
||||
これが、すべてのAPIを作成するための主要なポイントになります。
|
||||
@@ -269,7 +262,7 @@ https://example.com/items/foo
|
||||
/items/foo
|
||||
```
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
「パス」は一般に「エンドポイント」または「ルート」とも呼ばれます。
|
||||
|
||||
@@ -321,7 +314,7 @@ APIを構築するときは、通常、これらの特定のHTTPメソッドを
|
||||
* パス `/`
|
||||
* <dfn title="HTTP GET メソッド"><code>get</code> オペレーション</dfn>
|
||||
|
||||
/// info | `@decorator` 情報
|
||||
/// note | `@decorator` 情報
|
||||
|
||||
Pythonにおける`@something`シンタックスはデコレータと呼ばれます。
|
||||
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
# フロントエンド { #frontend }
|
||||
|
||||
`app.frontend()`(または `router.frontend()`)で静的なフロントエンドアプリを配信できます。
|
||||
|
||||
これは、Vite を使った React、TanStack Router、Astro、Vue、Svelte、Angular、Solid など、静的ファイルを生成するフロントエンドツールで役立ちます。
|
||||
|
||||
これらのツールでは、通常、次のようなコマンドでフロントエンドをビルドするステップがあります。
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
これにより、フロントエンドファイルを含む `./dist/` のようなディレクトリが生成されます。
|
||||
|
||||
`app.frontend()` を使うと、これらのフロントエンドフレームワークが必要とする規約に従って、そのディレクトリを配信できます。
|
||||
|
||||
**FastAPI** は最初に *path operations* をチェックします。通常のルートに一致しなかった場合にのみフロントエンドファイルがチェックされるため、API には影響しません。
|
||||
|
||||
## フロントエンドの配信 { #serve-a-frontend }
|
||||
|
||||
たとえば `npm run build` でフロントエンドをビルドした後、生成されたファイルを `dist` などのディレクトリに配置します。
|
||||
|
||||
プロジェクト構成は次のようになります。
|
||||
|
||||
```text
|
||||
.
|
||||
├── pyproject.toml
|
||||
├── app
|
||||
│ ├── __init__.py
|
||||
│ └── main.py
|
||||
└── dist
|
||||
├── index.html
|
||||
└── assets
|
||||
└── app.js
|
||||
```
|
||||
|
||||
そして `app.frontend()` で配信します。
|
||||
|
||||
{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
|
||||
|
||||
これにより、`/assets/app.js` へのリクエストで `dist/assets/app.js` を配信できます。
|
||||
|
||||
**FastAPI** の *path operation* もある場合は、*path operation* が優先されます。
|
||||
|
||||
## クライアントサイドルーティング { #client-side-routing }
|
||||
|
||||
**single-page apps**(SPA)を含む多くのフロントエンドアプリは、クライアントサイドルーティングを使います。`/dashboard/settings` のようなパスは実際のファイルではなく、フレームワークが処理するものかもしれません。
|
||||
|
||||
そのため、その URL に直接アクセスした場合(アプリ内で遷移するのではなく)、バックエンドは `index.html` からフロントエンドアプリを配信し、フロントエンドフレームワークがクライアントサイドルーティングを処理できるようにする必要があります。
|
||||
|
||||
そのためには、`fallback="index.html"` を使います。
|
||||
|
||||
{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
|
||||
|
||||
**FastAPI** は、このフォールバックをブラウザのナビゲーションに見える `GET` および `HEAD` リクエストにのみ使用します。JavaScript、CSS、画像などの存在しないファイルは引き続き `404` を返します。
|
||||
|
||||
`POST` や `PUT` など、他のメソッドのリクエストがフロントエンドのフォールバックにのみ一致するパスへ送られた場合も、`404` を返します。通常の **FastAPI** の *path operations* は、フロントエンドのルートよりも引き続き高い優先順位を持ちます。
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
デフォルトでは、`fallback` の値は `fallback="auto"` です。ほとんどの場合、`fallback` を指定する必要はありません。詳細は以下を参照してください。
|
||||
|
||||
///
|
||||
|
||||
これは、TanStack Router を使った React、Vue、Angular、SvelteKit、Solid など、クライアントサイドルーティングを使う多くのフロントエンドアプリで望まれる動作です。
|
||||
|
||||
## カスタム 404 ページ { #custom-404-page }
|
||||
|
||||
存在しないフロントエンドパスに対して、静的な `404.html` ページを配信することもできます。
|
||||
|
||||
{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
|
||||
|
||||
そのレスポンスはステータスコード `404` を保持します。
|
||||
|
||||
この場合、**FastAPI** は存在しないフロントエンドパスに対して `index.html` を配信しません。代わりに `404.html` ファイルを返します。
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
デフォルトでは、`fallback` の値は `fallback="auto"` です。これにより、`404.html` ファイルが見つかった場合、自動的にフォールバックとして使われます。
|
||||
|
||||
そのため、通常は `fallback` 引数を省略できます。
|
||||
|
||||
///
|
||||
|
||||
これは、Astro のように各ページの静的 HTML ファイルを生成するフロントエンドツールで役立ちます。
|
||||
|
||||
## 自動フォールバック { #fallback-auto }
|
||||
|
||||
デフォルトでは、`app.frontend()` は `fallback="auto"` を使います。
|
||||
|
||||
フロントエンドディレクトリに `404.html` ファイルがある場合、存在しないフロントエンドパスはそのファイルをステータスコード `404` で配信します。
|
||||
|
||||
そうでない場合、`index.html` ファイルがあれば、存在しないブラウザナビゲーションのパスは `index.html` を配信します。これは、クライアントサイドルーティングを使う多くのフロントエンドアプリが期待する動作です。
|
||||
|
||||
そのため、ほとんどの場合、`fallback` 引数を指定せずに `app.frontend("/", directory="dist")` を使用できます。
|
||||
|
||||
{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
|
||||
|
||||
## フォールバックの無効化 { #disable-fallback }
|
||||
|
||||
存在しないフロントエンドパスに対してフォールバックファイルを配信したくない場合は、`fallback=None` を使います。
|
||||
|
||||
{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
|
||||
|
||||
すると、存在しないフロントエンドパスは通常の `404` を返します。
|
||||
|
||||
## ディレクトリのチェック { #check-directory }
|
||||
|
||||
デフォルトでは、`app.frontend()` はアプリ作成時にディレクトリが存在することをチェックします。
|
||||
|
||||
これにより、設定エラーを早期に検出できます。たとえば、フロントエンドのビルド出力ディレクトリが存在しない場合、**FastAPI** は起動時にエラーを発生させます。
|
||||
|
||||
アプリオブジェクトの作成後に別のビルドステップなどでフロントエンドファイルが作成される場合は、`check_dir=False` を設定します。
|
||||
|
||||
{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
|
||||
|
||||
`check_dir=False` を指定すると、**FastAPI** はアプリ作成時にディレクトリをチェックしません。リクエストが処理される時点で設定されたディレクトリがまだ存在しない場合、**FastAPI** はその時点でエラーを発生させます。
|
||||
|
||||
## `APIRouter` での使用 { #use-it-with-apirouter }
|
||||
|
||||
フロントエンドファイルを `APIRouter` に追加し、prefix 付きで include することもできます。
|
||||
|
||||
{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
|
||||
|
||||
この例では、フロントエンドのパスは `/app` 配下で配信されます。
|
||||
|
||||
他の router 内のものを含め、アプリ内の通常の *path operations* は引き続き優先されます。
|
||||
|
||||
## 静的ビルド出力のみ { #static-build-output-only }
|
||||
|
||||
`app.frontend()` は、フロントエンドのビルドで既に生成されたファイルを配信します。
|
||||
|
||||
server-side rendering は実行しません。これは静的ファイルを生成するフロントエンドフレームワーク向けであり、各リクエストごとにサーバー上で動的レンダリングを必要とするフレームワーク向けではありません。
|
||||
@@ -1,5 +1,6 @@
|
||||
# エラーハンドリング { #handling-errors }
|
||||
|
||||
|
||||
APIを使用しているクライアントにエラーを通知する必要がある状況はたくさんあります。
|
||||
|
||||
このクライアントは、フロントエンドを持つブラウザ、誰かのコード、IoTデバイスなどが考えられます。
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# チュートリアル - ユーザーガイド { #tutorial-user-guide }
|
||||
|
||||
|
||||
このチュートリアルでは、**FastAPI**のほとんどの機能を使う方法を段階的に紹介します。
|
||||
|
||||
各セクションは前のセクションを踏まえた内容になっています。しかし、トピックごとに分割されているので、特定のAPIのニーズを満たすために、任意の特定のトピックに直接進めるようになっています。
|
||||
|
||||
@@ -11,10 +11,10 @@ OpenAPI仕様および自動APIドキュメントUIで使用される次のフ
|
||||
| `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> |
|
||||
|
||||
以下のように設定できます:
|
||||
|
||||
@@ -74,7 +74,7 @@ OpenAPI 3.1.0 および FastAPI 0.99.0 以降では、`license_info` を `url`
|
||||
|
||||
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
タグの詳細は [Path Operation の設定](path-operation-configuration.md#tags) を参照してください。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# Path Operationの設定 { #path-operation-configuration }
|
||||
|
||||
|
||||
*path operationデコレータ*を設定するためのパラメータがいくつかあります。
|
||||
|
||||
/// warning | 注意
|
||||
@@ -72,13 +73,13 @@ docstringに[Markdown](https://en.wikipedia.org/wiki/Markdown)を記述すれば
|
||||
|
||||
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`response_description`は具体的にレスポンスを参照し、`description`は*path operation*全般を参照していることに注意してください。
|
||||
|
||||
///
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
OpenAPIは*path operation*ごとにレスポンスの説明を必要としています。
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
FastAPI はバージョン 0.95.0 で`Annotated`のサポートを追加し(そして推奨し始めました)。
|
||||
|
||||
@@ -131,7 +131,7 @@ Pythonはその`*`で何かをすることはありませんが、それ以降
|
||||
* `lt`: `l`ess `t`han
|
||||
* `le`: `l`ess than or `e`qual
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`Query`、`Path`、および後で見る他のクラスは、共通の`Param`クラスのサブクラスです。
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
|
||||
|
||||
ここでは、 `item_id` は `int` として宣言されています。
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
これにより、関数内でのエディターサポート (エラーチェックや補完など) が提供されます。
|
||||
|
||||
@@ -34,7 +34,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
|
||||
{"item_id":3}
|
||||
```
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
関数が受け取った(および返した)値は、文字列の `"3"` ではなく、Pythonの `int` としての `3` であることに注意してください。
|
||||
|
||||
@@ -66,7 +66,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
|
||||
|
||||
[http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) で見られるように、`int` のかわりに `float` が与えられた場合にも同様なエラーが表示されます。
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
したがって、同じPythonの型宣言を使用することで、**FastAPI**はデータのバリデーションを行います。
|
||||
|
||||
@@ -82,7 +82,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
|
||||
|
||||
<img src="/img/tutorial/path-params/image01.png">
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
繰り返しになりますが、同じPython型宣言を使用するだけで、**FastAPI**は対話的なドキュメントを自動的に生成します(Swagger UIを統合)。
|
||||
|
||||
|
||||
@@ -24,12 +24,12 @@ FastAPIは、 `q` はデフォルト値が `= None` であるため、必須で
|
||||
|
||||
そのために、まずは以下をインポートします:
|
||||
|
||||
* `fastapi` から `Query`
|
||||
* `typing` から `Annotated`
|
||||
- `fastapi` から `Query`
|
||||
- `typing` から `Annotated`
|
||||
|
||||
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(推奨し始め)ました。
|
||||
|
||||
@@ -41,7 +41,7 @@ FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(
|
||||
|
||||
## `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 で使うときです。 🚀
|
||||
|
||||
@@ -79,9 +79,9 @@ q: Annotated[str | None] = None
|
||||
|
||||
FastAPI は次を行います:
|
||||
|
||||
* 最大長が 50 文字であることを確かめるようデータを **検証** する
|
||||
* データが有効でないときに、クライアントに **明確なエラー** を表示する
|
||||
* OpenAPI スキーマの *path operation* にパラメータを **ドキュメント化** する(その結果、**自動ドキュメント UI** に表示されます)
|
||||
- 最大長が 50 文字であることを確かめるようデータを **検証** する
|
||||
- データが有効でないときに、クライアントに **明確なエラー** を表示する
|
||||
- OpenAPI スキーマの *path operation* にパラメータを **ドキュメント化** する(その結果、**自動ドキュメント UI** に表示されます)
|
||||
|
||||
## 代替(古い方法): デフォルト値としての `Query` { #alternative-old-query-as-the-default-value }
|
||||
|
||||
@@ -174,9 +174,9 @@ FastAPI なしで同じ関数を **別の場所** から **呼び出しても**
|
||||
|
||||
この特定の正規表現パターンは受け取ったパラメータの値をチェックします:
|
||||
|
||||
* `^`: は、これ以降の文字で始まり、これより以前には文字はありません。
|
||||
* `fixedquery`: は、正確な`fixedquery`を持っています.
|
||||
* `$`: で終わる場合、`fixedquery`以降には文字はありません.
|
||||
- `^`: は、これ以降の文字で始まり、これより以前には文字はありません。
|
||||
- `fixedquery`: は、正確な`fixedquery`を持っています.
|
||||
- `$`: で終わる場合、`fixedquery`以降には文字はありません.
|
||||
|
||||
もしこれらすべての **「正規表現」** のアイデアについて迷っていても、心配しないでください。多くの人にとって難しい話題です。正規表現を必要としなくても、まだ、多くのことができます。
|
||||
|
||||
@@ -242,7 +242,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
|
||||
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のレスポンスは以下のようになります:
|
||||
|
||||
@@ -382,7 +382,7 @@ Pydantic には [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
|
||||
|
||||
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
これは Pydantic バージョン 2 以上で利用できます。 😎
|
||||
|
||||
@@ -432,16 +432,16 @@ Pydantic には [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
|
||||
|
||||
一般的なバリデーションとメタデータ:
|
||||
|
||||
* `alias`
|
||||
* `title`
|
||||
* `description`
|
||||
* `deprecated`
|
||||
- `alias`
|
||||
- `title`
|
||||
- `description`
|
||||
- `deprecated`
|
||||
|
||||
文字列に固有のバリデーション:
|
||||
|
||||
* `min_length`
|
||||
* `max_length`
|
||||
* `pattern`
|
||||
- `min_length`
|
||||
- `max_length`
|
||||
- `pattern`
|
||||
|
||||
`AfterValidator` を使ったカスタムバリデーション。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# クエリパラメータ { #query-parameters }
|
||||
|
||||
|
||||
パスパラメータではない関数パラメータを宣言すると、それらは自動的に「クエリ」パラメータとして解釈されます。
|
||||
|
||||
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
|
||||
@@ -65,7 +66,7 @@ http://127.0.0.1:8000/items/?skip=20
|
||||
|
||||
この場合、関数パラメータ `q` はオプショナルとなり、デフォルトでは `None` になります。
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
パスパラメータ `item_id` はパスパラメータであり、`q` はそれとは違ってクエリパラメータであると判別できるほど**FastAPI** が賢いということにも注意してください。
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
# リクエストファイル { #request-files }
|
||||
|
||||
|
||||
`File` を使って、クライアントがアップロードするファイルを定義できます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
アップロードされたファイルを受け取るには、まず [`python-multipart`](https://github.com/Kludex/python-multipart) をインストールします。
|
||||
|
||||
@@ -28,7 +29,7 @@ $ pip install python-multipart
|
||||
|
||||
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`File` は `Form` を直接継承したクラスです。
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
FastAPI では、フォームフィールドを宣言するために **Pydantic モデル**を使用できます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
フォームを使うには、まず [`python-multipart`](https://github.com/Kludex/python-multipart) をインストールします。
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
`File`と`Form`を同時に使うことでファイルとフォームフィールドを定義することができます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
アップロードされたファイルやフォームデータを受信するには、まず[`python-multipart`](https://github.com/Kludex/python-multipart)をインストールします。
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
JSONの代わりにフィールドを受け取る場合は、`Form`を使用します。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
フォームを使うためには、まず[`python-multipart`](https://github.com/Kludex/python-multipart)をインストールします。
|
||||
|
||||
@@ -32,7 +32,7 @@ $ pip install python-multipart
|
||||
|
||||
`Form`では`Body`(および`Query`や`Path`、`Cookie`)と同じ設定を宣言することができます。これには、バリデーション、例、エイリアス(例えば`username`の代わりに`user-name`)などが含まれます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`Form`は`Body`を直接継承するクラスです。
|
||||
|
||||
@@ -56,7 +56,7 @@ HTMLフォーム(`<form></form>`)がサーバにデータを送信する方
|
||||
|
||||
しかし、フォームがファイルを含む場合は、`multipart/form-data`としてエンコードされます。ファイルの扱いについては次の章で説明します。
|
||||
|
||||
これらのエンコーディングやフォームフィールドの詳細については、[<abbr title="Mozilla Developer Network - Mozilla 開発者ネットワーク">MDN</abbr> の `POST` ウェブドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)を参照してください。
|
||||
これらのエンコーディングやフォームフィールドの詳細については、[<abbr title="Mozilla Developer Network - Mozilla 開発者ネットワーク">MDN</abbr> の `POST` のウェブドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)を参照してください。
|
||||
|
||||
///
|
||||
|
||||
@@ -70,4 +70,4 @@ HTMLフォーム(`<form></form>`)がサーバにデータを送信する方
|
||||
|
||||
## まとめ { #recap }
|
||||
|
||||
フォームデータの入力パラメータを宣言するには、`Form`を使用する。
|
||||
フォームデータの入力パラメータを宣言するには、`Form`を使用します。
|
||||
|
||||
@@ -72,7 +72,7 @@ FastAPIはこの `response_model` を使って、データのドキュメント
|
||||
|
||||
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`EmailStr` を使用するには、最初に [`email-validator`](https://github.com/JoshData/python-email-validator) をインストールしてください。
|
||||
|
||||
@@ -251,7 +251,7 @@ Pydanticフィールドとして有効ではないものを返し、ツール(
|
||||
}
|
||||
```
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
以下も使用できます:
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# レスポンスステータスコード { #response-status-code }
|
||||
|
||||
|
||||
レスポンスモデルを指定するのと同じ方法で、レスポンスに使用されるHTTPステータスコードを以下の*path operations*のいずれかの`status_code`パラメータで宣言することもできます。
|
||||
|
||||
* `@app.get()`
|
||||
@@ -18,7 +19,7 @@
|
||||
|
||||
`status_code`パラメータはHTTPステータスコードを含む数値を受け取ります。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`status_code`は代わりに、Pythonの[`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)のように、`IntEnum`を受け取ることもできます。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# リクエストのExampleデータの宣言 { #declare-request-example-data }
|
||||
|
||||
|
||||
アプリが受け取れるデータの例を宣言できます。
|
||||
|
||||
ここでは、それを行ういくつかの方法を紹介します。
|
||||
@@ -24,7 +25,7 @@
|
||||
|
||||
///
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
OpenAPI 3.1.0(FastAPI 0.99.0以降で使用)では、**JSON Schema**標準の一部である`examples`がサポートされました。
|
||||
|
||||
@@ -155,7 +156,7 @@ OpenAPIは、仕様の他の部分にも`example`と`examples`フィールドを
|
||||
* `File()`
|
||||
* `Form()`
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
この古いOpenAPI固有の`examples`パラメータは、FastAPI `0.103.0`以降は`openapi_examples`になりました。
|
||||
|
||||
@@ -171,7 +172,7 @@ OpenAPIは、仕様の他の部分にも`example`と`examples`フィールドを
|
||||
|
||||
JSON Schemaのこの新しい`examples`フィールドは、OpenAPIの他の場所(上で説明)にあるような追加メタデータを持つdictではなく、**単なる例の`list`**です。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
OpenAPI 3.1.0がこのJSON Schemaとの新しいよりシンプルな統合とともにリリースされた後も、しばらくの間、自動ドキュメントを提供するツールであるSwagger UIはOpenAPI 3.1.0をサポートしていませんでした(バージョン5.0.0からサポートされています🎉)。
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
## 実行 { #run-it }
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
[`python-multipart`](https://github.com/Kludex/python-multipart) パッケージは、`pip install "fastapi[standard]"` コマンドを実行すると **FastAPI** と一緒に自動的にインストールされます。
|
||||
|
||||
@@ -60,7 +60,7 @@ $ fastapi dev
|
||||
|
||||
<img src="/img/tutorial/security/image01.png">
|
||||
|
||||
/// check | Authorizeボタン!
|
||||
/// tip | Authorizeボタン!
|
||||
|
||||
すでにピカピカの新しい「Authorize」ボタンがあります。
|
||||
|
||||
@@ -109,7 +109,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
|
||||
* ユーザーがフロントエンドでクリックして、フロントエンドのWebアプリの別のセクションに移動します。
|
||||
* フロントエンドはAPIからさらにデータを取得する必要があります。
|
||||
* しかし、特定のエンドポイントの認証が必要です。
|
||||
* したがって、APIで認証するため、HTTPヘッダー`Authorization`に`Bearer`の文字列とトークンを加えた値を送信します。
|
||||
* したがって、APIで認証するため、HTTPヘッダー`Authorization`に`Bearer `の文字列とトークンを加えた値を送信します。
|
||||
* トークンに`foobar`が含まれている場合、`Authorization`ヘッダーの内容は次のようになります: `Bearer foobar`。
|
||||
|
||||
## **FastAPI**の`OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer }
|
||||
@@ -118,7 +118,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
|
||||
|
||||
この例では、**Bearer**トークンを使用して**OAuth2**を**Password**フローで使用します。これには`OAuth2PasswordBearer`クラスを使用します。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
「bearer」トークンが、唯一の選択肢ではありません。
|
||||
|
||||
@@ -148,7 +148,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
|
||||
|
||||
実際の path operation もすぐに作ります。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
非常に厳格な「Pythonista」であれば、パラメーター名のスタイルが`tokenUrl`ではなく`token_url`であることを気に入らないかもしれません。
|
||||
|
||||
@@ -176,9 +176,9 @@ oauth2_scheme(some, parameters)
|
||||
|
||||
**FastAPI**は、この依存関係を使用してOpenAPIスキーマ (および自動APIドキュメント) で「セキュリティスキーム」を定義できることを知っています。
|
||||
|
||||
/// info | 技術詳細
|
||||
/// 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に統合する方法を知ることができます。
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
ボディを宣言するのに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 }
|
||||
|
||||
@@ -52,7 +52,7 @@ Pydanticモデルの `User` として、 `current_user` の型を宣言するこ
|
||||
|
||||
///
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
依存関係システムがこのように設計されているおかげで、 `User` モデルを返却する別の依存関係(別の「dependables」)を持つことができます。
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# パスワード(およびハッシュ化)による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>トークンと安全なパスワードのハッシュ化を使用して、実際にアプリケーションを安全にしてみましょう。
|
||||
|
||||
このコードは、アプリケーションで実際に使用したり、パスワードハッシュをデータベースに保存するといった用途に利用できます。
|
||||
|
||||
@@ -42,11 +42,11 @@ $ pip install pyjwt
|
||||
|
||||
</div>
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
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)で確認できます。
|
||||
|
||||
///
|
||||
|
||||
@@ -120,7 +120,7 @@ pwdlibはbcryptハッシュアルゴリズムもサポートしていますが
|
||||
|
||||
`authenticate_user` がデータベースに存在しないユーザー名で呼び出された場合でも、ダミーのハッシュを使って `verify_password` を実行します。
|
||||
|
||||
これにより、ユーザー名が有効かどうかに関わらずエンドポイントの応答時間がおおよそ同じになり、既存のユーザー名を列挙するために悪用されうる「タイミング攻撃」を防止できます。
|
||||
これにより、ユーザー名が有効かどうかに関わらずエンドポイントの応答時間がおおよそ同じになり、既存のユーザー名を列挙するために悪用されうる**タイミング攻撃**を防止できます。
|
||||
|
||||
/// note | 備考
|
||||
|
||||
@@ -213,9 +213,9 @@ IDの衝突を回避するために、ユーザーのJWTトークンを作成す
|
||||
Username: `johndoe`
|
||||
Password: `secret`
|
||||
|
||||
/// check | 確認
|
||||
/// tip | 豆知識
|
||||
|
||||
コードのどこにも平文のパスワード"`secret`"はなく、ハッシュ化されたものしかないことを確認してください。
|
||||
コードのどこにも平文のパスワード「`secret`」はなく、ハッシュ化されたものしかないことを確認してください。
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ OAuth2 では、「password flow」(ここで使用するフロー)を使う
|
||||
|
||||
また、データベースのモデルでは任意の別名を使って構いません。
|
||||
|
||||
しかし、ログイン用の path operation では、仕様との互換性を保つ(たとえば組み込みのAPIドキュメントシステムを使えるようにする)ために、これらの名前を使う必要があります。
|
||||
しかし、ログイン用の *path operation* では、仕様との互換性を保つ(たとえば組み込みのAPIドキュメントシステムを使えるようにする)ために、これらの名前を使う必要があります。
|
||||
|
||||
また、仕様では `username` と `password` はフォームデータとして送らなければならない(つまり、ここではJSONは使わない)ことも定められています。
|
||||
|
||||
@@ -32,7 +32,7 @@ OAuth2 では、「password flow」(ここで使用するフロー)を使う
|
||||
- `instagram_basic` は Facebook / Instagram で使われます。
|
||||
- `https://www.googleapis.com/auth/drive` は Google で使われます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
OAuth2 における「スコープ」は、要求される特定の権限を表す単なる文字列です。
|
||||
|
||||
@@ -50,7 +50,7 @@ OAuth2 にとっては単なる文字列です。
|
||||
|
||||
### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }
|
||||
|
||||
まず、`OAuth2PasswordRequestForm` をインポートし、`/token` の path operation に `Depends` で依存関係として使います:
|
||||
まず、`OAuth2PasswordRequestForm` をインポートし、`/token` の *path operation* に `Depends` で依存関係として使います:
|
||||
|
||||
{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}
|
||||
|
||||
@@ -72,7 +72,7 @@ OAuth2 の仕様では、固定値 `password` を持つフィールド `grant_ty
|
||||
- オプションの `client_id`(この例では不要)
|
||||
- オプションの `client_secret`(この例では不要)
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`OAuth2PasswordRequestForm` は、`OAuth2PasswordBearer` のように **FastAPI** にとって特別なクラスではありません。
|
||||
|
||||
@@ -132,7 +132,7 @@ OAuth2 の仕様では、固定値 `password` を持つフィールド `grant_ty
|
||||
|
||||
`UserInDB(**user_dict)` は次を意味します:
|
||||
|
||||
`user_dict` のキーと値を、そのままキーワード引数として渡します。つまり次と同等です:
|
||||
*`user_dict` のキーと値を、そのままキーワード引数として渡します。つまり次と同等です:*
|
||||
|
||||
```Python
|
||||
UserInDB(
|
||||
@@ -144,9 +144,9 @@ UserInDB(
|
||||
)
|
||||
```
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
`**user_dict` のより完全な解説は、[**追加モデル**のドキュメント](../extra-models.md#about-user-in-dict)を参照してください。
|
||||
`**user_dict` のより完全な解説は、[**追加モデル**のドキュメント](../extra-models.md#about-user-in-model-dump)を参照してください。
|
||||
|
||||
///
|
||||
|
||||
@@ -188,7 +188,7 @@ UserInDB(
|
||||
|
||||
アクティブなユーザーの場合にのみ `current_user` を取得したいとします。
|
||||
|
||||
そこで、`get_current_active_user` を依存関係として利用する追加の依存関係 `get_current_active_user` を作成します。
|
||||
そこで、今度は `get_current_user` を依存関係として利用する追加の依存関係 `get_current_active_user` を作成します。
|
||||
|
||||
これら2つの依存関係は、ユーザーが存在しない、または非アクティブである場合に、HTTPエラーを返すだけです。
|
||||
|
||||
@@ -196,7 +196,7 @@ UserInDB(
|
||||
|
||||
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
ここで返している値が `Bearer` の追加ヘッダー `WWW-Authenticate` も仕様の一部です。
|
||||
|
||||
@@ -236,7 +236,7 @@ Password: `secret`
|
||||
|
||||
### 自分のユーザーデータを取得 { #get-your-own-user-data }
|
||||
|
||||
`GET` の path `/users/me` を使います。
|
||||
今度は path `/users/me` で operation `GET` を使います。
|
||||
|
||||
次のようなユーザーデータが取得できます:
|
||||
|
||||
@@ -268,7 +268,7 @@ User: `alice`
|
||||
|
||||
Password: `secret2`
|
||||
|
||||
そして `GET` の path `/users/me` を使います。
|
||||
そして path `/users/me` で operation `GET` を使ってみます。
|
||||
|
||||
次のような「Inactive user」エラーになります:
|
||||
|
||||
@@ -284,6 +284,6 @@ Password: `secret2`
|
||||
|
||||
これらの道具を使えば、任意のデータベース、任意のユーザー/データモデルと互換性のあるセキュリティシステムを構築できます。
|
||||
|
||||
ただし、実際にはまだ「安全」ではありません。
|
||||
唯一欠けている点は、実際にはまだ「安全」ではないことです。
|
||||
|
||||
次の章では、安全なパスワードハッシュライブラリと <abbr title="JSON Web Tokens - JSON Web Token">JWT</abbr> トークンの使い方を見ていきます。
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
これは[JSON Lines のストリーミング](stream-json-lines.md)に似ていますが、`text/event-stream` フォーマットを使用します。これはブラウザがネイティブに [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) でサポートしています。
|
||||
|
||||
/// info | 情報
|
||||
/// note
|
||||
|
||||
FastAPI 0.135.0 で追加されました。
|
||||
|
||||
@@ -27,7 +27,7 @@ data: {"name": "Plumbus", "price": 32.99}
|
||||
|
||||
SSE は、AI チャットのストリーミング、ライブ通知、ログやオブザビリティなど、サーバーがクライアントへ更新をプッシュする用途で一般的に使われます。
|
||||
|
||||
/// tip | 豆知識
|
||||
/// tip
|
||||
|
||||
バイナリデータ(例: 動画や音声)をストリーミングしたい場合は、上級ガイド [データのストリーミング](../advanced/stream-data.md) を参照してください。
|
||||
|
||||
@@ -47,7 +47,7 @@ yield された各アイテムは JSON にエンコードされ、SSE イベン
|
||||
|
||||
{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *}
|
||||
|
||||
/// tip | 豆知識
|
||||
/// tip
|
||||
|
||||
Pydantic が**Rust** 側でシリアライズを行うため、戻り値の型を宣言しない場合に比べて大幅に**高性能**になります。
|
||||
|
||||
@@ -81,13 +81,13 @@ Pydantic が**Rust** 側でシリアライズを行うため、戻り値の型
|
||||
|
||||
## 生データ { #raw-data }
|
||||
|
||||
JSON エンコードせずにデータを送る必要がある場合は、`data` の代わりに `raw_data` を使用します。
|
||||
JSON エンコードせずにデータを送る必要がある場合は、`raw_data` を使用します。
|
||||
|
||||
これは、整形済みテキスト、ログ行、または `[DONE]` のような特別な <dfn title="特別な条件や状態を示すために用いられる値">"センチネル"</dfn> 値を送るのに有用です。
|
||||
これは、整形済みテキスト、ログ行、または <dfn title="特別な条件や状態を示すために用いられる値">「センチネル」</dfn> といった特別な値(例: `[DONE]`)を送るのに有用です。
|
||||
|
||||
{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *}
|
||||
|
||||
/// note | 備考
|
||||
/// note
|
||||
|
||||
`data` と `raw_data` は相互排他的です。各 `ServerSentEvent` ではどちらか一方しか設定できません。
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# SQL(リレーショナル)データベース { #sql-relational-databases }
|
||||
|
||||
|
||||
FastAPI は SQL(リレーショナル)データベースの使用を必須にはしません。必要であれば、任意のデータベースを使用できます。
|
||||
|
||||
ここでは [SQLModel](https://sqlmodel.tiangolo.com/) を使った例を見ていきます。
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
|
||||
`StaticFiles` を使用して、ディレクトリから静的ファイルを自動的に提供できます。
|
||||
|
||||
/// tip | 豆知識
|
||||
|
||||
フロントエンドをホストする必要がある場合は、代わりに `app.frontend()` を使用してください。詳しくは [フロントエンド](frontend.md) を読んでください。
|
||||
|
||||
`app.frontend()` は内部で `StaticFiles` を使用しており、client-side routing の処理など、フロントエンド向けの追加の利点がいくつかあります。
|
||||
|
||||
///
|
||||
|
||||
## `StaticFiles` の使用 { #use-staticfiles }
|
||||
|
||||
* `StaticFiles` をインポート。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
データのシーケンスを**「ストリーム」**で送りたい場合、**JSON Lines** を使って実現できます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
FastAPI 0.134.0 で追加されました。
|
||||
|
||||
@@ -48,7 +48,7 @@ sequenceDiagram
|
||||
|
||||
これは JSON 配列(Python の list に相当)にとてもよく似ていますが、`[]` で囲まず、アイテム間の `,` もありません。その代わりに、**1 行に 1 つの JSON オブジェクト**で、改行文字で区切られます。
|
||||
|
||||
/// info | 情報
|
||||
/// note | 備考
|
||||
|
||||
重要な点は、クライアントが前の行を消費している間に、アプリ側は次の行を順次生成して送れることです。
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
## `TestClient` を使用 { #using-testclient }
|
||||
|
||||
/// info
|
||||
/// note | 備考
|
||||
|
||||
`TestClient` を使用するには、まず [`httpx`](https://www.python-httpx.org) をインストールします。
|
||||
|
||||
@@ -22,7 +22,7 @@ $ pip install httpx
|
||||
|
||||
`TestClient` をインポートします。
|
||||
|
||||
`TestClient` を作成し、**FastAPI** に渡します。
|
||||
**FastAPI** アプリケーションを渡して `TestClient` を作成します。
|
||||
|
||||
`test_` から始まる名前の関数を作成します (これは `pytest` の標準的なコンベンションです)。
|
||||
|
||||
@@ -32,7 +32,7 @@ $ pip install httpx
|
||||
|
||||
{* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *}
|
||||
|
||||
/// tip
|
||||
/// tip | 豆知識
|
||||
|
||||
テスト関数は `async def` ではなく、通常の `def` であることに注意してください。
|
||||
|
||||
@@ -50,9 +50,9 @@ $ pip install httpx
|
||||
|
||||
///
|
||||
|
||||
/// tip
|
||||
/// tip | 豆知識
|
||||
|
||||
FastAPIアプリケーションへのリクエストの送信とは別に、テストで `async` 関数 (非同期データベース関数など) を呼び出したい場合は、高度なチュートリアルの[Async Tests](../advanced/async-tests.md) を参照してください。
|
||||
FastAPIアプリケーションへのリクエストの送信とは別に、テストで `async` 関数 (非同期データベース関数など) を呼び出したい場合は、高度なチュートリアルの[非同期テスト](../advanced/async-tests.md) を参照してください。
|
||||
|
||||
///
|
||||
|
||||
@@ -64,7 +64,7 @@ FastAPIアプリケーションへのリクエストの送信とは別に、テ
|
||||
|
||||
### **FastAPI** アプリファイル { #fastapi-app-file }
|
||||
|
||||
[Bigger Applications](bigger-applications.md) で説明されている、次のようなファイル構成があるとします:
|
||||
[大規模なアプリケーション](bigger-applications.md) で説明されている、次のようなファイル構成があるとします:
|
||||
|
||||
```
|
||||
.
|
||||
@@ -113,7 +113,7 @@ FastAPIアプリケーションへのリクエストの送信とは別に、テ
|
||||
│ └── test_main.py
|
||||
```
|
||||
|
||||
ここで、**FastAPI** アプリがある `main.py` ファイルには、他の path operation があります。
|
||||
ここで、**FastAPI** アプリがある `main.py` ファイルには、他の **path operations** がいくつかあります。
|
||||
|
||||
エラーを返す可能性のある `GET` オペレーションがあります。
|
||||
|
||||
@@ -144,7 +144,7 @@ FastAPIアプリケーションへのリクエストの送信とは別に、テ
|
||||
|
||||
(`httpx` または `TestClient` を使用して) バックエンドにデータを渡す方法の詳細は、[HTTPXのドキュメント](https://www.python-httpx.org)を確認してください。
|
||||
|
||||
/// info
|
||||
/// note | 備考
|
||||
|
||||
`TestClient` は、Pydanticモデルではなく、JSONに変換できるデータを受け取ることに注意してください。
|
||||
|
||||
|
||||
@@ -35,15 +35,15 @@ Pythonプロジェクトの作業では、**仮想環境**(または類似の
|
||||
<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
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user