[FastAPI] Path & Query, Body, Cookie, Header 매개변수, Form 데이터 > IT 기술백서

IT 기술백서

직접 알아내거나 검색하기 귀찮아서 모아 둔 것

python | [FastAPI] Path & Query, Body, Cookie, Header 매개변수, Form 데이터

본문

1. 경로매개변수(Path)


    1) 기본

    ex) /users/5

[code]

@app.get("/users/{id}")

async def read_user(id):

    return { "user_id": id }

[/code]

    

    2) 타입지정

    ex) /users/5

[code]

@app.get("/users/{id}")

async def read_user(id: int):

    return { "user_id": id }

[/code]


    

    3) 경로문자열을 매개변수로 보내기

    ex) /files/data/photo/me.jpg

[code]

@app.get("/files/{file_path: path}")

aync def read_file(file_path: str):

    return { "file_path": file_path }

[/code] 

    

    

2. 쿼리 매개변수


    1) 기본

    ex) /items/?skip=0&limit=10

[code]

@app.get("/items/")

async def read_item(skip: int=0, limit: int=10):

    return { "skip": skin, "limit": limit }

[/code]

    

    

    2) 선택적 매개변수

[code]

from typing import Optional 


@app.get("/items/{item_id}")

# fastapi 에서는 str만 쓰면 되지만 Optional[str]은 편집기에서 오류를 찾아낼 수 있게 함

async def read_item(item_id: str, q: Optional[str] = None): 

    if q:

        return { "item_id": item_id, "q": q }

    return { "item_id": item_id }

[/code]

 

※ 매개변수에 기본값이 없으면 required(필수)가 된다

 

 

3. Body 매개변수 (POST 로 넘어온 값 처리)

post 요청을 처리하기 위해서는 pydantic 모듈의 BaseModel로 데이터모델을 만들어야 한다.

    1)  기본

[code]

from pydantic import BaseModel


class Item(BaseModel):

    name: str

    description: Optional[str] = None

    price: float

    tax: Optional[float] = None

    

@app.post("/items/")

async def create_item(item: Item):

    return { "name": item.name, "description": item.description, "price": item.price, "tax": item.tax }

[/code]


    2) 그룹으로 여러개 받을때

[code]

from pydantic import BaseModel


class Item(BaseModel):

    name: str

    description: Optional[str] = None

    price: float

    tax: Optional[float] = None

 

class User(BaseModel):

    name: str

    age: int

    

@app.post("/items/")

async def create_item(item: Item, user: User):

    return { 

        "item": {

            "name": item.name,

            "description": item.description,

            "price": item.price,

            "tax": item.tax

        },

        "user": {

            "name": user.name,

            "age": user.age

        }

    }

[/code]

 

요청 데이터는 아래와 같다.

[code]

    "item": {

        "name": item.name,

        "description": item.description,

        "price": item.price,

        "tax": item.tax

    },

    "user": {

        "name": user.name,

        "age": user.age

    }

}

[/code] 

 

    3) 데이터모델로 정의 되지 않은 추가 값을 받을때는 Body 를 사용한다.

[code]

from fastapi import FastAPI, Body

...

async def create_item(item: Item, etc:int=Body(...)):

    pass

[/code]

 

 

4. 쿠키 매개변수

[code]

from fastapi import FastAPI, Cookie

...

@app.get("/items/")

async def read_items(ads_id:str = Cookie(None)):

    return { "ads_ids": ads_id }

[/code]

 

 

5. 헤더 매개변수

사용법은 다른 매개변수랑 거의 동일하다.

[code]

from fastapi import FastAPI, Header

 

@app.get("/items/")

async def read_items(user_agent: Optional[str] = Header(None)):

    return { "User-Agent": user_agent }

[/code]

헤더의 키는 "User-Agent" 와 같이 수신된다.  하지만 파이썬변수에는 하이픈을 허용하지 않는다.

fastapi 의 Header 는 하이픈을 자동으로 언더바("_") 로 변환하며 모두 소문자로 바꾼다.

그래서 "User-Agent" 키를 "user_agent" 와 같이 변수로 지정하면 된다.

특별한 경우에 그대로 받아야 한다면 Header(None, convert_underscores=False) 로 하면 하이픈 변환이 일어나지 않는다.

 

※ 중복헤더 받기

[code]

async def read_items(x_token: Optional[List[str]] = Header(None)):

    return { "X-Token values": x_token }

[/code]

결과

[code]

{

    "X-Token values": [

        "foo",

        "bar"

    ]

}

[/code]

 

 

6. Form 데이터

[code]

from fastapi import FastAPI, Form


app = FastAPI()


@app.post("/login/")

async def login(username: str = Form(...), password: str = Form(...)):

    return { "username": username }

[/code]

댓글 0개

등록된 댓글이 없습니다.

Menu