Eine POST-Anfrage mit list[UploadFile] führt zu HTTP 422: Unprocessable EntityPython

Python-Programme
Anonymous
 Eine POST-Anfrage mit list[UploadFile] führt zu HTTP 422: Unprocessable Entity

Post by Anonymous »

Wir nutzen mehrere Microservices mit Python und FastAPI. Die empfangende API verfügt über einen Endpunkt, der so aussieht:

Code: Select all

@router.post("/{connector_id}/upload")
@router.post("/{connector_id}/upload/{upload_id}")
async def upload(
tenant_id: str,
connector_id: str,
files: list[UploadFile],
upload_id: str | None = None,
controller: ConnectorController = Depends(get_controller),
) -> dict:
...
Auch versucht, Dateien hinzuzufügen: list[UploadFile]= File(...),, aber ohne Erfolg.
Der sendende Microservice erstellt den Endpunkt wie folgt:

Code: Select all

async def upload_file(
self,
files: list[UploadFile],
) -> str:
url = [...]

form_data = ["files",(file.filename, file.file, file.content_type) for file in files]

try:
response = await self._client.post(url=url, files=form_data)
except ConnectError as e:
[...]
Bearbeiten: Ich habe die Formulardaten hier falsch formatiert, aber selbst wenn sie als Tupel formatiert sind, erhalte ich, wie Kommentatoren darauf hingewiesen haben, immer noch den Fehler 422.

Code: Select all

form_data = [("files",(f.filename, f.file, "application/vnd.apache.parquet")) for f in files]
Beim Debuggen können Sie sehen, dass Formulardaten tatsächlich ein Tupel sind.
wobei _client ein httpx.AsyncClient ist und Dateien wie folgt erstellt werden:

Code: Select all

parquet_buffer = io.BytesIO()
df.to_parquet(parquet_buffer, index=False) #Pandas dataframe
parquet_buffer.seek(0)

upload_file = UploadFile(
filename=file.name,
file=parquet_buffer,
size=parquet_buffer.getbuffer().nbytes,
)
upload_files.append(upload_file)
Aber egal was ich mache, ich erhalte die folgende Antwort HTTP 422: Unprocessable Entity:

Code: Select all

b'{"detail":[{"loc":["body","files"],"msg":"field required","type":"value_error.missing"}]}'
Der Endpunkt funktioniert wie erwartet sowohl mit Swagger als auch mit Postman.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post