Skip to content

Commit bceaac5

Browse files
🌐 Update translations for ja (add-missing)
1 parent 8712af9 commit bceaac5

6 files changed

Lines changed: 522 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Base64 にしたバイトを含む JSON { #json-with-bytes-as-base64 }
2+
3+
アプリで JSON データの受信・送信が必要だが、その中にバイナリデータを含める必要がある場合は、base64 にエンコードできます。
4+
5+
## Base64 とファイル { #base64-vs-files }
6+
7+
バイナリデータのアップロードにはまず、JSON にエンコードする代わりに [Request Files](../tutorial/request-files.md) を、バイナリデータの送信には [カスタムレスポンス - FileResponse](./custom-response.md#fileresponse--fileresponse-) を使えるか検討してください。
8+
9+
JSON は UTF-8 でエンコードされた文字列のみを含められるため、生のバイト列は含められません。
10+
11+
Base64 はバイナリデータを文字列にエンコードできますが、そのために元のバイナリより多くの文字を使用する必要があり、通常は通常のファイルより非効率です。
12+
13+
JSON にバイナリデータをどうしても含める必要があり、ファイルを使えない場合にのみ base64 を使用してください。
14+
15+
## Pydantic `bytes` { #pydantic-bytes }
16+
17+
Pydantic モデルで `bytes` 型のフィールドを宣言し、モデル設定で `val_json_bytes` を使うと、入力 JSON データの検証時に base64 を用いるよう指示できます。この検証の一環として、base64 文字列はバイト列へデコードされます。
18+
19+
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
20+
21+
「/docs」を確認すると、`data` フィールドが base64 でエンコードされたバイト列を期待していることが表示されます。
22+
23+
<div class="screenshot">
24+
<img src="/img/tutorial/json-base64-bytes/image01.png">
25+
</div>
26+
27+
次のようなリクエストを送れます:
28+
29+
```json
30+
{
31+
"description": "Some data",
32+
"data": "aGVsbG8="
33+
}
34+
```
35+
36+
/// tip | 豆知識
37+
38+
`aGVsbG8=``hello` の base64 エンコードです。
39+
40+
///
41+
42+
その後、Pydantic は base64 文字列をデコードし、モデルの `data` フィールドに元のバイト列を渡します。
43+
44+
次のようなレスポンスを受け取ります:
45+
46+
```json
47+
{
48+
"description": "Some data",
49+
"content": "hello"
50+
}
51+
```
52+
53+
## 出力データ向けの Pydantic `bytes` { #pydantic-bytes-for-output-data }
54+
55+
出力データ用にモデル設定で `ser_json_bytes` とともに `bytes` フィールドを使用することもでき、Pydantic は JSON レスポンスを生成するときにバイト列を base64 でシリアライズします。
56+
57+
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
58+
59+
## 入力・出力データ向けの Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data }
60+
61+
もちろん、同じモデルを base64 を使うように設定しておけば、JSON データの受信時は `val_json_bytes` で入力を「検証」し、送信時は `ser_json_bytes` で出力を「シリアライズ」する、といった具合に、入力と出力の両方を扱えます。
62+
63+
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# データのストリーミング { #stream-data }
2+
3+
JSON として構造化できるデータをストリームしたい場合は、[JSON Lines をストリームする](../tutorial/stream-json-lines.md) を参照してください。
4+
5+
しかし、純粋なバイナリデータや文字列をストリームしたい場合は、次のようにできます。
6+
7+
/// info | 情報
8+
9+
FastAPI 0.134.0 で追加されました。
10+
11+
///
12+
13+
## ユースケース { #use-cases }
14+
15+
例えば、AI LLM サービスの出力をそのまま、純粋な文字列としてストリームしたい場合に使えます。
16+
17+
メモリに一度に全て読み込むことなく、読み込みながらチャンクごとに送ることで、巨大なバイナリファイルをストリームすることにも使えます。
18+
19+
同様に、動画や音声をストリームすることもできます。処理しながら生成し、そのまま送信することも可能です。
20+
21+
## `yield` を使った `StreamingResponse` { #a-streamingresponse-with-yield }
22+
23+
path operation 関数で `response_class=StreamingResponse` を宣言すると、`yield` を使ってデータをチャンクごとに順次送信できます。
24+
25+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
26+
27+
FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し、JSON などに変換しようとはしません。
28+
29+
### 非 async な path operation 関数 { #non-async-path-operation-functions }
30+
31+
`async` なしの通常の `def` 関数でも同様に `yield` を使えます。
32+
33+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *}
34+
35+
### アノテーションなし { #no-annotation }
36+
37+
バイナリデータをストリームする場合、戻り値の型アノテーションを宣言する必要は実際にはありません。
38+
39+
この場合、FastAPI はデータを Pydantic で JSON 化したり、何らかの方法でシリアライズしようとしないため、型アノテーションはエディタやツール向けの補助にすぎず、FastAPI 自体では使用されません。
40+
41+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
42+
43+
つまり、`StreamingResponse` では型アノテーションに依存せず、送信したい形式に合わせてバイト列を生成・エンコードする「自由」と「責任」があなたにあります。 🤓
44+
45+
### バイト列をストリームする { #stream-bytes }
46+
47+
主なユースケースの一つは、文字列ではなく `bytes` をストリームすることです。もちろん可能です。
48+
49+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *}
50+
51+
## カスタム `PNGStreamingResponse` { #a-custom-pngstreamingresponse }
52+
53+
上記の例ではバイト列をストリームしましたが、レスポンスに `Content-Type` ヘッダがないため、クライアントは受け取るデータの種類を認識できませんでした。
54+
55+
`StreamingResponse` を継承したカスタムクラスを作成し、ストリームするデータに応じて `Content-Type` ヘッダを設定できます。
56+
57+
例えば、`media_type` 属性で `Content-Type``image/png` に設定する `PNGStreamingResponse` を作成できます:
58+
59+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
60+
61+
その後、path operation 関数で `response_class=PNGStreamingResponse` としてこの新しいクラスを使用できます:
62+
63+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
64+
65+
### ファイルを模擬する { #simulate-a-file }
66+
67+
この例では `io.BytesIO` でファイルを模擬しています。これはメモリ上だけに存在するファイルライクオブジェクトですが、通常のファイルと同じインターフェースを提供します。
68+
69+
例えば、ファイルと同様にイテレートして内容を読み出せます。
70+
71+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *}
72+
73+
/// note | 技術詳細
74+
75+
他の2つの変数 `image_base64``binary_image` は、画像を Base64 でエンコードし、それを `bytes` に変換してから `io.BytesIO` に渡したものです。
76+
77+
この例では1つのファイル内に完結させ、コピーしてそのまま実行できるようにするためだけのものです。 🥚
78+
79+
///
80+
81+
`with` ブロックを使うことで、ジェネレータ関数(`yield` を持つ関数)が終了した後、つまりレスポンス送信が完了した後に、そのファイルライクオブジェクトが確実にクローズされます。
82+
83+
この例では `io.BytesIO` によるメモリ内の疑似ファイルなので重要度は高くありませんが、実ファイルの場合は処理後に確実にクローズすることが重要です。
84+
85+
### ファイルと非同期 { #files-and-async }
86+
87+
多くの場合、ファイルライクオブジェクトはデフォルトでは async/await と互換性がありません。
88+
89+
例えば、`await file.read()``async for chunk in file` のような操作は提供されていません。
90+
91+
また、多くの場合、ディスクやネットワークから読み出すため、読み取りはブロッキング(イベントループをブロックし得る)処理になります。
92+
93+
/// info | 情報
94+
95+
上記の例は例外で、`io.BytesIO` は既にメモリ上にあるため、読み取りが何かをブロックすることはありません。
96+
97+
しかし多くの場合、ファイルやファイルライクオブジェクトの読み取りはブロッキングになります。
98+
99+
///
100+
101+
イベントループのブロッキングを避けるには、path operation 関数を `async def` ではなく通常の `def` で宣言してください。そうすると FastAPI はその関数をスレッドプールワーカー上で実行し、メインループのブロッキングを避けます。
102+
103+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
104+
105+
/// tip | 豆知識
106+
107+
async 関数内からブロッキングなコードを呼び出す必要がある場合、あるいはブロッキングな関数内から async 関数を呼び出す必要がある場合は、FastAPI の兄弟ライブラリである [Asyncer](https://asyncer.tiangolo.com) を利用できます。
108+
109+
///
110+
111+
### `yield from` { #yield-from }
112+
113+
ファイルライクオブジェクトのようなものをイテレートして各要素に対して `yield` している場合、`for` ループを省略して、`yield from` で各要素をそのまま送ることもできます。
114+
115+
これは FastAPI 固有ではなく単なる Python の機能ですが、知っておくと便利な小ワザです。 😎
116+
117+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Content-Type の厳格チェック { #strict-content-type-checking }
2+
3+
既定では、FastAPI は JSON リクエストボディに対して厳格な `Content-Type` ヘッダーのチェックを行います。つまり、JSON のリクエストを JSON として解析するには、有効な `Content-Type` ヘッダー(例: `application/json`)を必ず含める必要があります。
4+
5+
## CSRF のリスク { #csrf-risk }
6+
7+
この既定の挙動は、ある特定の状況における Cross-Site Request Forgery(CSRF)攻撃の一種に対する保護を提供します。
8+
9+
これらの攻撃は、次の条件を満たすときにブラウザが CORS のプリフライトチェックを行わずにスクリプトからリクエストを送信できる事実を悪用します。
10+
11+
- `Content-Type` ヘッダーがない(例: `Blob` をボディにして `fetch()` を使う)
12+
- かつ、いかなる認証情報も送信しない
13+
14+
この種の攻撃は主に次のような場合に関係します。
15+
16+
- アプリケーションがローカル(例: `localhost`)または社内ネットワークで動作している
17+
- かつ、アプリに認証がなく、同一ネットワークからのリクエストは信頼できると想定している
18+
19+
## 攻撃例 { #example-attack }
20+
21+
ローカルで AI エージェントを実行できる仕組みを構築したとします。
22+
23+
それは次の API を提供します。
24+
25+
```
26+
http://localhost:8000/v1/agents/multivac
27+
```
28+
29+
フロントエンドもあります。
30+
31+
```
32+
http://localhost:8000
33+
```
34+
35+
/// tip | 豆知識
36+
37+
両方とも同じホストであることに注意してください。
38+
39+
///
40+
41+
そのフロントエンドを使って、AI エージェントに自分の代わりに作業をさせられます。
42+
43+
それが「公開インターネット」ではなくローカルで動作しているため、ローカルネットワークへのアクセスを信頼し、認証を一切設定しないことにしたとします。
44+
45+
すると、ユーザーの一人がそれをインストールしてローカルで実行できます。
46+
47+
その後、例えば次のような悪意のあるサイトを開く可能性があります。
48+
49+
```
50+
https://evilhackers.example.com
51+
```
52+
53+
そしてその悪意のあるサイトが、`Blob` をボディにした `fetch()` を使ってローカルの API にリクエストを送信します。
54+
55+
```
56+
http://localhost:8000/v1/agents/multivac
57+
```
58+
59+
悪意のあるサイトとローカルアプリのホストは異なるにもかかわらず、ブラウザは次の理由で CORS のプリフライトリクエストを発行しません。
60+
61+
- 認証なしで動作しており、認証情報を送る必要がないため
62+
- ブラウザは(`Content-Type` ヘッダーがないため)JSON を送っていないと判断するため
63+
64+
その結果、悪意のあるサイトがローカルの AI エージェントに、ユーザーの元上司に怒りのメッセージを送らせることができてしまいます... あるいは、もっと悪いことも。 😅
65+
66+
## 公開インターネット { #open-internet }
67+
68+
アプリが公開インターネット上にある場合、「ネットワークを信頼」して認証なしで誰にでも特権的なリクエストを送らせることはしないはずです。
69+
70+
攻撃者は単にスクリプトを実行して API にリクエストを送れます。ブラウザを介する必要がないため、すでに特権エンドポイントは保護しているでしょう。
71+
72+
その場合、これはあなたには当てはまらない攻撃/リスクです。
73+
74+
このリスクと攻撃が主に問題になるのは、アプリがローカルネットワークで動作し、それだけが前提の保護となっている場合です。
75+
76+
## Content-Type なしのリクエストを許可する { #allowing-requests-without-content-type }
77+
78+
`Content-Type` ヘッダーを送らないクライアントをサポートする必要がある場合は、`strict_content_type=False` を設定して厳格チェックを無効化できます。
79+
80+
{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *}
81+
82+
この設定では、`Content-Type` ヘッダーがないリクエストでもボディが JSON として解析されます。これは古いバージョンの FastAPI と同じ挙動です。
83+
84+
/// info | 情報
85+
86+
この挙動と設定は FastAPI 0.132.0 で追加されました。
87+
88+
///

docs/ja/docs/editor-support.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# エディタ対応 { #editor-support }
2+
3+
公式の[FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)は、*path operation* の検出・ナビゲーションに加え、FastAPI Cloud へのデプロイやライブログストリーミングなど、FastAPI の開発ワークフローを強化します。
4+
5+
拡張機能の詳細は、[GitHub リポジトリ](https://github.com/fastapi/fastapi-vscode)の README を参照してください。
6+
7+
## セットアップとインストール { #setup-and-installation }
8+
9+
**FastAPI Extension**[VS Code](https://code.visualstudio.com/)[Cursor](https://www.cursor.com/) の両方で利用できます。各エディタの拡張機能パネルから「FastAPI」を検索し、**FastAPI Labs** が公開している拡張機能を選択して直接インストールできます。 [vscode.dev](https://vscode.dev)[github.dev](https://github.dev) などのブラウザベースのエディタでも動作します。
10+
11+
### アプリケーション検出 { #application-discovery }
12+
13+
既定では、ワークスペース内で `FastAPI()` を生成しているファイルを走査し、FastAPI アプリケーションを自動検出します。プロジェクト構成の都合で自動検出が機能しない場合は、`pyproject.toml``[tool.fastapi]`、または VS Code 設定の `fastapi.entryPoint` にモジュール記法(例: `myapp.main:app`)でエントリポイントを指定できます。
14+
15+
## 機能 { #features }
16+
17+
- **Path Operation エクスプローラー** - アプリケーション内のすべての <dfn title="ルート、エンドポイント">*path operations*</dfn> をサイドバーのツリービューで表示します。クリックして任意のルートまたはルーター定義へジャンプできます。
18+
- **ルート検索** - <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>(macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>)で、パス・メソッド・名前で検索できます。
19+
- **CodeLens ナビゲーション** - テストクライアント呼び出し(例: `client.get('/items')`)の上に表示されるクリック可能なリンクから、対応する *path operation* にジャンプし、テストと実装の行き来をすばやく行えます。
20+
- **FastAPI Cloud へデプロイ** - [FastAPI Cloud](https://fastapicloud.com/) にワンクリックでアプリをデプロイできます。
21+
- **アプリケーションログのストリーミング** - FastAPI Cloud にデプロイしたアプリから、レベルフィルタやテキスト検索付きでリアルタイムにログをストリーミングできます。
22+
23+
拡張機能の機能に慣れるには、コマンドパレット(<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" のウォークスルーを選んでください。

0 commit comments

Comments
 (0)