es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo cargar tanto un archivo como datos JSON utilizando FastAPI?

Este es mi modelo Pydantic:

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

Este es el punto de conexión:

def create_base(
    base: Base = Form(...),
    file: List[UploadFile] = File(...)
):
...

Estoy intentando enviar una solicitud mediante un formulario multipart, pero estoy obteniendo el siguiente error:

{
    "detail": [
        {
            "loc": [
                "body",
                "base"
            ],
            "msg": "el valor no es un diccionario válido",
            "type": "type_error.dict"
        }
    ]
} 

Este es el contenido de mi solicitud:

{
  "name": "string",
  "point": 10.0,
  "is_accepted": true
}

¿Qué estoy haciendo mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la solicitud es que no se está enviando correctamente como un formulario multipartes. Para enviar correctamente un formulario multipartes, los campos de datos y archivos deben separarse en diferentes secciones dentro del cuerpo de la solicitud.

    Para solucionar el error, la carga útil de la solicitud debe actualizarse para incluir tanto los campos de datos como los archivos, y también especificar el encabezado “Content-Type” como “multipart/form-data”. Aquí tienes un ejemplo de cómo podría verse la carga útil actualizada:

    ------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
    Content-Disposition: form-data; name="name"\r\n\r\n
    string\r\n
    ------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
    Content-Disposition: form-data; name="point"\r\n\r\n
    10.0\r\n
    ------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
    Content-Disposition: form-data; name="is_accepted"\r\n\r\n
    true\r\n
    ------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n
    Content-Disposition: form-data; name="file"; filename="example.txt"\r\n
    Content-Type: text/plain\r\n\r\n
    Contenido del archivo de ejemplo.\r\n\r\n
    ------WebKitFormBoundary7MA4YWxkTrZu0gW--
    

    Ten en cuenta que cada campo de datos y archivo se separa por un límite (especificado en el encabezado “Content-Type”), y que cada sección se formatea como un encabezado “Content-Disposition” seguido del contenido real de los datos o archivos.

    Una vez que la carga útil se haya actualizado, la solicitud debe enviarse con el encabezado “Content-Type” correcto y los campos separados en diferentes secciones, como se muestra arriba.

Comments are closed.