python / / 2024. 8. 16. 11:18

[fastapi] Form Data 처리하기

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}

위 예제에서는 nameageForm 클래스를 사용하여 폼 데이터로 받는다. 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는 UploadFileFile 클래스를 사용하여 파일 업로드를 지원한다.

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/ 엔드포인트에 폼 데이터를 전송한다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유