0

リクエストを使用して、JSON データ + ファイル (バイナリ) を FastAPI 'POST' エンドポイントにアップロードしようとしています。

これはサーバーコードです:

@app.post("/files/")
async def create_file(
    file: bytes = File(...), fileb: UploadFile = File(...), timestamp: str = Form(...)
):
    return {
        "file_size": len(file),
        "timestamp": timestamp,
        "fileb_content_type": fileb.content_type,
    }

これはクライアント コードです。

session = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries=0)
session.mount('http://', adapter)

jpg_image = open(IMG_PATH, 'rb').read()

timestamp_str = datetime.datetime.now().isoformat()
files = {
    'timestamp': (None, timestamp_str),
    'file': ('image.jpg', jpg_image),
}
request = requests.Request('POST',
                           FILE_UPLOAD_ENDPOINT,
                           files=files)
prepared_request = request.prepare()
response = session.send(prepared_request)

サーバーは失敗します

「POST /files/ HTTP/1.1」 422 処理不能エンティティ

4

1 に答える 1

2

通常、FastAPI エンドポイントは、要求本文に必須フィールドがない場合、または予期しないフィールドがある場合などに 422 を応答します。

filebリクエストボディからが欠落しているようです。

  • このフィールドがオプションの場合、エンドポイント定義で次のように宣言する必要があります。

    fileb: Optional[UploadFile] = File(None)
    

    また、エンドポイント コード内でいくつかのチェックを行う必要があります...

  • 必須フィールドの場合は、リクエスト本文に追加する必要があります。

于 2021-01-14T10:18:23.347 に答える