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]