第15章 ファイル ファイル
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
プレビュー
APIリクエストやHTMLのような伝統的なコンテンツを扱うだけでなく、ウェブサーバは双方向のファイル転送を処理することが期待されている。 非常に大きなファイルは、システムのメモリをあまり使わないように、塊で転送する必要があるかもしれない。また、StaticFiles を使って、ファイル・ディレクトリ(および任意の深さのサブディレクトリ)へのアクセスを提供することもできる。
マルチパートのサポート
大きなファイルを処理するために、FastAPIのアップロードとダウンロード機能には、これらの余分なモジュールが必要である:
- Pythonマルチパート
-
pip install python-multipart - aioファイル
-
pip install aiofiles
ファイルをアップロードする
FastAPIはAPI開発をターゲットにしており、本書のほとんどの例ではJSONリクエスト/レスポンスを使ってきた。 しかし次の章では、扱いが異なるフォームを見ることになる。 この章では、ある意味ではフォームのように扱われるファイルを取り上げる。
FastAPIはファイルアップロードに2つのテクニックを提供する:File() とUploadFile 。
ファイル()
File() パス関数は同期式( )でも非同期式( )でも構わないが、ファイルをアップロードしている間、ウェブサーバに負荷をかけないという点で、非同期式の方が優れている。defasync def
FastAPIはファイルをチャンクでプルアップし、メモリ内で再アセンブルするので、File() 、比較的小さなファイルのみに使用すべきである。入力がJSONであると仮定する代わりに、FastAPIはファイルをフォーム要素としてエンコーディングする。
ファイルをリクエストし、それをテストするコードを書いてみよう。テストするファイルは、マシンにあるものでもよいし、Fastest Fishのようなサイトからダウンロードしてもよい。、私はそこから1KBのファイルを取得し、ローカルに1KB.binとして保存した。
例15-1では、main.pyの先頭に以下の行を追加する。
例 15-1. FastAPI で小さなファイルアップロードを処理する
fromfastapiimportFile@app.post("/small")asyncdefupload_small_file(small_file:bytes=File())->str:returnf"file size:{len(small_file)}"
Uvicornが再起動したら、例15-2の HTTPieテストを試す。
例15-2. HTTPieを使って小さなファイルをアップロードする
$ http -f -b POST http://localhost:8000/small small_file@1KB.bin "file size: 1000"
以下、このテストに関するメモをいくつか記す:
-
ファイルがJSONテキストとしてではなく、フォームのようにアップロードされるため、
-f(または--form)を含める必要がある。 -
small_file@1KB.bin:small_file-
例 15-1の FastAPI パス関数の変数名 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access