스택큐힙리스트

Pydantic 모델을 FastAPI에서 폼 데이터와 함께 사용하는 방법 본문

카테고리 없음

Pydantic 모델을 FastAPI에서 폼 데이터와 함께 사용하는 방법

스택큐힙리스트 2023. 11. 5. 11:48
반응형

저는 HTML 폼에서 데이터를 제출하고 Pydantic 모델로 유효성을 검사하려고 합니다.


다음 코드를 사용합니다.


from fastapi import FastAPI, Form
from pydantic import BaseModel
from starlette.responses import HTMLResponse
app = FastAPI()
@app.get(/form, response_class=HTMLResponse)
def form_get():
return '''<form method=post>
<input type=text name=no value=1/>
<input type=text name=nm value=abcd/>
<input type=submit/>
</form>'''
class SimpleModel(BaseModel):
no: int
nm: str =
@app.post(/form, response_model=SimpleModel)
def form_post(form_data: SimpleModel = Form(...)):
return form_data

{
detail: [
{
loc: [
body,
form_data
],
msg: field required,
type: value_error.missing
}
]
}


해당하는 curl 명령어(파이어폭스로 생성됨)는 다음과 같습니다.


curl 'http://localhost:8001/form' -H 'Content-Type: application/x-www-form-urlencoded' --data 'no=1&nm=abcd'

여기서 요청 본문에는 no=1&nm=abcd가 포함되어 있습니다.


저는 어디서 실수한 것일까요?

답변 1

import inspect
from typing import Type
from fastapi import Form
from pydantic import BaseModel
from pydantic.fields import ModelField
def as_form(cls: Type[BaseModel]):
new_parameters = []
for field_name, model_field in cls.__fields__.items():
model_field: ModelField # type: ignore
new_parameters.append(
inspect.Parameter(
model_field.alias,
inspect.Parameter.POSITIONAL_ONLY,
default=Form(...) if model_field.required else Form(model_field.default),
annotation=model_field.outer_type_,
)
)
async def as_form_func(**data):
return cls(**data)
sig = inspect.signature(as_form_func)
sig = sig.replace(parameters=new_parameters)
as_form_func.__signature__ = sig # type: ignore
setattr(cls, 'as_form', as_form_func)
return cls

그리고 사용 예는 다음과 같습니다.

@as_form
클래스 테스트(BaseModel):
param: str
a: int = 1
b: str = '2342'
c: bool = False
d: Optional[float] = None
@router.post('/me', response_model=Test)
async def me(request: Request, form: Test = Depends(Test.as_form)):
return form

답변 2

최적의 코드 구조를 작성하기 위해서는 Pydantic 모델을 사용하는 것이 중요합니다. FastAPI는 Python으로 작성된 웹 프레임워크로, 데이터 유효성 검사에 편리한 Pydantic 모델과 잘 통합됩니다. 이 기사에서는 FastAPI와 함께 Form 데이터를 처리하고 Pydantic 모델을 사용하는 방법을 알아보겠습니다.
우선, Pydantic 모델을 정의해야 합니다. Pydantic 모델은 데이터의 구조를 정의하고, 유효성 검사를 수행하는 데 도움을 줍니다. 아래의 예시 코드에서는 사용자의 이름과 이메일을 포함한 User 모델을 정의하였습니다.
```python
from pydantic import BaseModel
class User(BaseModel):
name: str
email: str
```
FastAPI에서 Form 데이터를 처리하기 위해서는 `Form` 객체를 사용합니다. `Form`은 FastAPI 모듈에서 가져와야 합니다. 아래의 예시 코드에서는 FastAPI 모듈을 가져온 후, `/user` 경로에 POST 요청을 처리하는 endpoint를 정의하였습니다.
```python
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
name: str
email: str
@app.post(/user)
async def create_user(user: User = Form(...)):
return {user: user}
```
위의 코드에서 `user` 파라미터는 `User` 모델을 인수로 받습니다. `Form(...)`은 Form 데이터에서 필드를 자동으로 가져옵니다. 이때, `...`은 필드가 누락되었을 경우 에러를 발생시킬 수 있습니다.
따라서, Pydantic 모델을 Form 데이터와 함께 사용하기 위해서는 `Form` 객체를 사용하여 필드를 정의하고, 해당 모델을 endpoint의 매개변수로 사용해야 합니다. 이렇게 함으로써 데이터 유효성 검사와 함께 Form 데이터를 처리할 수 있습니다.
예를 들어, `/user` 경로로 POST 요청을 보내려면 다음과 같은 데이터를 전송해야 합니다.
```
name: John
email: john@example.com
```
위의 데이터는 Pydantic 모델에 따라 유효성 검사를 거칩니다. 즉, `name`과 `email` 필드가 올바른 문자열 형식인지 확인됩니다.
이처럼 FastAPI와 Pydantic을 함께 사용하여 Form 데이터를 처리하는 방법을 알아보았습니다. 데이터 유효성 검사를 통해 안정적인 코드를 작성하고, Pydantic 모델을 사용함으로써 재사용 가능한 구조를 구축할 수 있습니다. FastAPI의 강력한 기능과 함께 Pydantic을 사용하면 효율적이고 안전한 웹 애플리케이션을 개발할 수 있습니다.

반응형
Comments