我正在使用Pydantic模型在FastAPI中创建一个注册API。在注册时,用户需要输入自己的文件,用户信息和学校信息。由于用户应该能够输入多个学校,我正在考虑将学校信息作为列表传递。根据我的研究,在同一个API中似乎不支持上传文件和发送JSON格式的数据。因此,我发现我需要以form_data而不是JSON格式(How to add both file and JSON body in a FastAPI POST request?)发送数据。我可以转换用户信息并将其作为表单数据发送,但我不确定如何传递学校信息列表。到目前为止,我所尝试的如下。
我使用了一个类方法来接收表单数据中的User信息。
class User(BaseModel):
name: str
password: str
email: str
@classmethod
def as_form(cls, name: str = Form(...), password: str= Form(...),
email: str= Form(...)) -> 'User':
return cls(name=first_name, password=password, email=email)
这是我想要的模型作为一个列表。
class School(BaseModel):
school: str
country: str
这是API。
@router.post("/signup", status_code=status.HTTP_201_CREATED)
async def signup(hospitals: List[School] = Form(...),
user: User = Depends(UserIn.as_form),
file: UploadFile = File(),session: Session = Depends(db.session)):
我试过schools: Annotated[Json[School], Form]
我还尝试为School模型创建一个as_form类方法,就像我为User模型所做的那样,以便将其作为这样的列表传递。然而,这对两个人都不起作用。此外,以列表形式传递表单数据似乎不是一种常用的方法。schools: List[School] = Depends(School.as_form)
我不知道该怎么办。我考虑过以JSON格式接收数据并在服务器上解析它,但在这种情况下,我应该如何定义Pydantic模型?我想知道在我目前的情况下最理想的方法。你能帮帮我吗?
1条答案
按热度按时间gxwragnw1#
解决这个问题的一种方法是有两个单独的
List
参数,一个用于schools
,另一个用于countries
。例如:然而,由于这样的解决方案需要在后端进行额外的工作来将两个列表形成一个等等,并且如果需要添加更多的列表,事情会变得更加复杂,因此下面也给出了以下解决方案。
下面提供的解决方案1和2分别主要基于this answer的方法3和4。因此,请参阅该答复以了解进一步的细节和解释。这两个解决方案都演示了如何使用单个
POST
请求在FastAPI中上传File
和List
JSON数据。下面还提供了Pythonrequests
和JavaScript Fetch API中的客户端示例。解决方案一
app.py
方案二
app.py
上述测试溶液1和2
使用Python请求
test.py
使用JavaScript Fetch API
templates/index.html