1. Form Data란?
Form Data는 웹 폼에서 사용자가 입력한 데이터를 서버에 제출할 때 사용되는 데이터 형식이다. 일반적으로 application/x-www-form-urlencoded
또는 multipart/form-data
로 인코딩되어 전송된다. 이 데이터는 URL 인코딩된 키-값 쌍으로 구성된다.
2. FastAPI에서 Form Data 사용하기
FastAPI에서는 Form
클래스를 사용하여 폼 데이터를 처리할 수 있다. 폼 데이터는 주로 POST 요청으로 전송되며, FastAPI의 Form
클래스를 사용하여 쉽게 파싱하고 검증할 수 있다.
2.1. 기본적인 Form Data 처리
기본적인 폼 데이터를 처리하는 방법을 살펴보자. 아래는 간단한 사용자 정보를 폼 데이터로 받는 예제이다.
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/submit/")
def submit_form(name: str = Form(...), age: int = Form(...)):
return {"name": name, "age": age}
위 예제에서는 name
과 age
를 Form
클래스를 사용하여 폼 데이터로 받는다. Form(...)
은 필수 필드를 의미하며, 클라이언트가 해당 필드를 포함하지 않으면 오류가 발생한다.
2.2. 기본값과 선택적 필드
폼 데이터 필드에 기본값을 설정하거나 선택적 필드를 만들 수 있다. Form
클래스의 두 번째 인자로 기본값을 설정할 수 있다.
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/submit/")
def submit_form(name: str = Form(...), age: int = Form(30)):
return {"name": name, "age": age}
이 코드에서는 age
필드에 기본값을 30
으로 설정했다. 클라이언트가 age
값을 제공하지 않으면 기본값이 사용된다.
2.3. 선택적 필드 처리
선택적 필드는 None
으로 기본값을 설정하여 처리할 수 있다.
from typing import Optional
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/submit/")
def submit_form(name: str = Form(...), age: Optional[int] = Form(None)):
return {"name": name, "age": age}
여기서 age
필드는 선택적이며, 클라이언트가 제공하지 않을 경우 None
으로 설정된다.
3. 파일 업로드와 Form Data
폼 데이터는 파일 업로드와 함께 사용될 수 있다. FastAPI는 UploadFile
과 File
클래스를 사용하여 파일 업로드를 지원한다.
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
contents = await file.read()
return {"filename": file.filename, "content_type": file.content_type, "size": len(contents)}
이 예제에서는 UploadFile
을 사용하여 클라이언트가 업로드한 파일을 처리한다. File(...)
은 필수 파일 필드를 의미한다.
4. Form Data와 Query Parameters의 혼합
폼 데이터와 쿼리 매개변수를 혼합하여 사용할 수 있다. 아래는 폼 데이터와 쿼리 파라미터를 동시에 사용하는 예제이다.
from fastapi import FastAPI, Form, Query
app = FastAPI()
@app.post("/submit/")
def submit_form(
name: str = Form(...),
age: int = Form(...),
country: str = Query("USA")
):
return {"name": name, "age": age, "country": country}
여기서 country
는 쿼리 파라미터로 전달되며, 기본값을 "USA"
로 설정한다.
5. 데이터 검증 및 유효성 검사
폼 데이터에 대한 유효성 검사를 수행할 수 있다. FastAPI는 Pydantic과 함께 작동하며, 입력 데이터의 유효성을 검사하는 데 유용하다. Pydantic의 BaseModel
을 사용하여 폼 데이터의 유효성을 검증할 수 있다.
from typing import Optional
from fastapi import FastAPI, Form
from pydantic import BaseModel, Field
app = FastAPI()
class UserForm(BaseModel):
name: str = Field(..., max_length=50)
age: Optional[int] = Field(None, ge=0, le=120)
@app.post("/submit/")
def submit_form(form: UserForm = Form(...)):
return form
여기서는 UserForm
모델을 사용하여 폼 데이터의 유효성을 검사한다. name
필드는 최대 길이를 50자로 제한하고, age
필드는 0에서 120 사이의 값을 허용한다.
6. HTML 폼 예제
클라이언트 측에서 HTML 폼을 통해 데이터를 제출하는 예제이다.
<!DOCTYPE html>
<html>
<head>
<title>Submit Form</title>
</head>
<body>
<form action="/submit/" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required><br><br>
<label for="age">Age:</label>
<input type="number" id="age" name="age" required><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
이 HTML 폼은 POST
방식으로 /submit/
엔드포인트에 폼 데이터를 전송한다.