ホームページ > バックエンド開発 > Python チュートリアル > FastAPI POST リクエストでファイルと JSON ボディを同時に処理するにはどうすればよいですか?

FastAPI POST リクエストでファイルと JSON ボディを同時に処理するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-26 20:20:11
オリジナル
255 人が閲覧しました

How to Handle File and JSON Body Simultaneously in a FastAPI POST Request?

FastAPI POST リクエストにファイルと JSON 本文の両方を追加する方法?

FastAPI は、API を構築するための最新の高速 (高性能) Web フレームワークです。これは Python 3.6 に基づいており、API の開発をより簡単かつ効率的にするための強力なツールと機能のセットを提供します。 FastAPI の重要な機能の 1 つは、ファイルと JSON 本文を含む POST リクエストを含む、幅広いリクエスト タイプの処理をサポートしていることです。

この記事では、ファイルと JSON 本文の両方を処理する方法について説明します。 FastAPI POST リクエスト。さまざまな方法を取り上げ、理解と実装を簡素化するコード例を示します。始めましょう!

FastAPI POST リクエストでのファイルと JSON 本文の処理

FastAPI POST リクエストでファイルと JSON 本文を処理するには、次のメソッドを使用できます:

フォームとファイルの使用: このメソッドを使用すると、パス操作で複数のフォーム パラメーターを宣言できます。ただし、リクエストでは application/json ではなく application/x-www-form-urlencoded を使用してエンコードされた本文が含まれるため、JSON として受信することが期待される本文フィールドを宣言することもできません (フォームにファイルが含まれている場合、マルチパートとしてエンコードされます) /form-data).

Pydantic モデルと依存関係の使用: Pydantic モデルを使用して、パラメーター化された変数が Base クラスに依存していることをエンドポイントに通知できます。この回答で説明されているように、クエリ パラメーターをエンドポイントで直接定義できます。

本文データを単一パラメーターとして渡す: 別のオプションは、本文データを (フォーム型の) 単一パラメーターとして次の形式で渡すことです。 JSON 文字列。そのためには、サーバー側で依存関係関数を作成する必要があります。

クラスメソッドを使用したカスタム クラスの使用: 指定された JSON 文字列を JSON 文字列に変換するために使用されるクラスメソッドを使用してカスタム クラスを組み込むこともできます。 Python 辞書。Pydantic モデルに対する検証に使用されます。

Base64 エンコード ファイルの使用: この方法には、ファイルの変換が含まれます。バイトを Base64 形式の文字列に変換し、それをサーバーに送信する可能性のある他のデータとともに JSON オブジェクトに追加します。ただし、ファイルのサイズが大きくなり、エンコードとデコードに追加のリソースが必要になるため、このアプローチはあまりお勧めできません。

コード例

いくつかのコード例を見て、処理方法を示してみましょう。さまざまなメソッドを使用した FastAPI POST リクエスト内のファイルと JSON 本文:

フォームとメソッドを使用するファイル:

from fastapi import Form, File, UploadFile, FastAPI
from typing import List
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.post("/submit")
def submit(
    name: str = Form(...),
    point: float = Form(...),
    is_accepted: bool = Form(...),
    files: List[UploadFile] = File(...),
):
    return {
        "JSON Payload": {"name": name, "point": point, "is_accepted": is_accepted},
        "Filenames": [file.filename for file in files],
    }

@app.get("/", response_class=HTMLResponse)
def main(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})
ログイン後にコピー
ログイン後にコピー

Pydantic モデルと依存関係を使用するメソッド:

from fastapi import Form, File, UploadFile, Request, FastAPI, Depends
from typing import List, Optional
from fastapi.responses import HTMLResponse
from pydantic import BaseModel
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

class Base(BaseModel):
    name: str
    point: Optional[float] = None
    is_accepted: Optional[bool] = False


def checker(data: str = Form(...)):
    try:
        return Base.model_validate_json(data)
    except ValidationError as e:
        raise HTTPException(
            detail=jsonable_encoder(e.errors()),
            status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
        )


@app.post("/submit")
def submit(base: Base = Depends(checker), files: List[UploadFile] = File(...)):
    return {
        "JSON Payload": base,
        "Filenames": [file.filename for file in files],
    }

@app.get("/", response_class=HTMLResponse)
def main(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})
ログイン後にコピー

クラスメソッドでカスタム クラスを使用するメソッド:

from fastapi import Form, File, UploadFile, FastAPI
from typing import List
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.post("/submit")
def submit(
    name: str = Form(...),
    point: float = Form(...),
    is_accepted: bool = Form(...),
    files: List[UploadFile] = File(...),
):
    return {
        "JSON Payload": {"name": name, "point": point, "is_accepted": is_accepted},
        "Filenames": [file.filename for file in files],
    }

@app.get("/", response_class=HTMLResponse)
def main(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})
ログイン後にコピー
ログイン後にコピー

これらのメソッドを使用すると、特定の要件に応じて FastAPI POST リクエスト内のファイルと JSON 本文を柔軟に処理できます。 Pydantic モデルを使用してデータを検証する必要がある場合でも、単に JSON 文字列を受信する必要がある場合でも、適切なソリューションが利用可能です。

結論

この記事では、両方のファイルを処理するためのさまざまな方法を検討しました。 FastAPI POST リクエストの JSON 本文。コード例と詳細な説明を提供することで、これらのメソッドの理解と実装をできるだけ簡単にすることを目指しました。 API を開発するときは、要件や好みに基づいて最適な方法を選択できます。

If

以上がFastAPI POST リクエストでファイルと JSON ボディを同時に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート