반응형
Notice
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 인공지능
- 컴퓨터비전
- 컴퓨터공학
- 웹개발
- 파이썬
- 자료구조
- 사이버보안
- 프로그래밍
- Yes
- 머신러닝
- 네트워크
- 클라우드컴퓨팅
- 버전관리
- 빅데이터
- 자바스크립트
- 데이터베이스
- 딥러닝
- springboot
- 데이터분석
- 보안
- 디자인패턴
- 데이터과학
- 소프트웨어공학
- 프로그래밍언어
- 데이터구조
- 알고리즘
- 소프트웨어
- 네트워크보안
- I'm Sorry
- 컴퓨터과학
Archives
- Today
- Total
스택큐힙리스트
Pydantic 모델을 FastAPI에서 폼 데이터와 함께 사용하는 방법 본문
반응형
저는 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