
FastAPI์์ Query Parameter๋ URL์ ? ๋ค์ ๋ถ๋ ๊ฐ์ผ๋ก,
์์ฒญ์ ์กฐ๊ฑดยท์ต์
ยท๋ฒ์๋ฅผ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
์ฆ Query Parameter๋,
http://127.0.0.1:8000/items/?skip=0&limit=10
| ๊ตฌ์ฑ ์์ | ์๋ฏธ |
|---|---|
/items/ |
Path (๋ฆฌ์์ค ์์น) |
? |
Query ์์ ์ง์ |
skip=0 |
Query Parameter |
limit=10 |
Query Parameter |
Query Parameter๋ ํญ์ key=value ํํ์ด๋ฉฐ,
์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ &๋ก ์ฐ๊ฒฐ๋๋ค.
| ๊ตฌ๋ถ | Path Parameter | Query Parameter |
|---|---|---|
| ์์น | URL ๊ฒฝ๋ก | ? ๋ค |
| ์ญํ | ๋ฆฌ์์ค ์๋ณ | ์กฐ๊ฑด / ์ต์ |
| ํ์ ์ฌ๋ถ | ๋๋ถ๋ถ ํ์ | ๋๋ถ๋ถ ์ ํ |
| ์์ | /users/1 |
?page=1 |
FastAPI๋ ํจ์ ๋งค๊ฐ๋ณ์๊ฐ Path์ ์์ผ๋ฉด ์๋์ผ๋ก Query Parameter๋ก ์ธ์ํ๋ค.
from fastapi import FastAPI
app = FastAPI()
# ๊ฐ์ง ๋ฐ์ดํฐ
fake_items_db = [
{"item_name": "Foo"},
{"item_name": "Bar"},
{"item_name": "Baz"},
]
@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
return fake_items_db[skip : skip + limit]
skip : ๊ฑด๋๋ธ ํญ๋ชฉ ์ (๊ธฐ๋ณธ๊ฐ: 0)limit : ๊ฐ์ ธ์ฌ ํญ๋ชฉ ์ (๊ธฐ๋ณธ๊ฐ: 10)http://127.0.0.1:8000/items/ โ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ (skip=0, limit=10)http://127.0.0.1:8000/items/?skip=0&limit=10โ ์์ ๋์ผ{"item_name": "Foo"},
{"item_name": "Bar"},
{"item_name": "Baz"}
http://127.0.0.1:8000/items/?skip=1&limit=1 โ ๋ ๋ฒ์งธ ํญ๋ชฉ 1๊ฐ{"item_name": "Bar"}
๐ Query Parameter๋ ์ ๋ฌ๋์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด ์ฌ์ฉ๋๋ค
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str | None = None):
# q๋ ์ ํ์ ๋งค๊ฐ๋ณ์
# ์ ๊ณต๋๋ฉด ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด None
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
q์ ์๋ฏธ
โข ์ฟผ๋ฆฌ(Query) ํ๋ผ๋ฏธํฐ
โข URL ๋ค์ ?key=value ํํ๋ก ์ ๋ฌ
โข ์ ํ ์ฌํญ์ด๋ค.
์๋ฅผ ๋ค์ด..
#q=fastapi โ q
/items/abc?q=fastapi
๊ฒฐ๊ณผ:
{"item_id":"abc","q":"fastapi"}
๊ธฐ๋ณธ๊ฐ ์์ด ์ ์ธํ๊ธฐ
@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str):
# needy๋ ํ์ query parameter
# ๊ธฐ๋ณธ๊ฐ์ด ์์ผ๋ฏ๋ก ๋ฐ๋์ ์ ๊ณต๋์ด์ผ ํจ
item = {"item_id": item_id, "needy": needy}
return item
๋ง์ฝ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด,
โ ์๋ชป๋ ์์ฒญ: http://127.0.0.1:8000/items/foo-item
์๋ต:
{
"detail": [
{
"type": "missing",
"loc": ["query", "needy"],
"msg": "Field required",
"input": null
}
]
}
โ
์ฌ๋ฐ๋ฅธ ์์ฒญ: http://127.0.0.1:8000/items/foo-item?needy=essential!
์๋ต:
{
"item_id": "foo-item",
"needy": "essential!"
}
Query Parameter๋ URL์์ ๋์ด์ฌ ๋ ๋ฌด์กฐ๊ฑด ๋ฌธ์์ด(str)์ด๋ค.
ํ์ง๋ง FastAPI์์๋ ํ์ ํํธ๋ฅผ ์ฐ๋ ์๊ฐ,
์ด ๋์์ ์ด๋ฃจ์ด์ง๋ค.
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(
item_id: str,
q: str | None = None,
short: bool = False # bool ํ์
์ ์ธ
):
item = {"item_id": item_id}
if q:
item.update({"q": q})
# short๊ฐ False๋ฉด ๊ธด ์ค๋ช
์ถ๊ฐ
if not short:
item.update({
"description": "This is an amazing item that has a long description"
})
return item
/items/{item_id}๋ก ์์ฒญ์ด ์ค๋ฉด
item_id๋ ํ์๋ก ๋ฐ๊ณ ,
q์ short๋ ์ ํ์ ์ผ๋ก ๋ฐ์์
์๋ต JSON์ ๋ด์ฉ๊ณผ ๊ธธ์ด๋ฅผ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฐ๊พผ๋ค.
์ด ๊ตฌ์กฐ๋ API ์๋ต ์ต์ ํ์ ๊ธฐ๋ณธ์ด๋ค.
์์:
โข ๋ชจ๋ฐ์ผ โ short=true
โข ์น ์์ธ ํ์ด์ง โ short=false
โข ๊ฒ์ API โ q ์ฌ์ฉ
์ฆ, ๊ฐ์ API๋ฅผ ์ํฉ์ ๋ง๊ฒ ๋ค๋ฅด๊ฒ ์ฐ๋ ๋ฐฉ์์ด๋ค.
?short=true โ True?short=True โ True?short=on โ True?short=1 โ True?short=yes โ TrueFalse์์ฒญ URL โ Query ๋ฌธ์์ด (?skip=1&limit=2) โ FastAPI ํ์ฑ โ ํ์ ํํธ ๊ธฐ๋ฐ ๋ณํ (str โ int, bool) โ ์ ํจ์ฑ ๊ฒ์ฌ โ ํจ์ ์คํ
/docs ์์ ๋ฐ๋ก ํ
์คํธ ๊ฐ๋ฅFastAPI์์๋ Path Parameter์ Query Parameter๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ํ ์ฌ์ค ํ๋:
โ ์ ์ธ ์์๋ ์ ํ ์ค์ํ์ง ์๋ค
๐ ์ด๋ฆ๊ณผ ์์น(Path์ ์๋๋ ์๋๋)๋ก ์๋ ๊ตฌ๋ถ๋๋ค
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
user_id: int, # Path Parameter (ํ์)
item_id: str, # Path Parameter (ํ์)
q: str | None = None, # Query Parameter (์ ํ)
short: bool = False # Query Parameter (๊ธฐ๋ณธ๊ฐ)
):
item = {
"item_id": item_id,
"owner_id": user_id
}
if q:
item["q"] = q
if not short:
item["description"] = "This is an amazing item with a long description"
return item
/users/1/items/abc
/users/1/items/abc?q=search
/users/1/items/abc?q=search&short=true
| ๊ธฐ์ค | ๋ถ๋ฅ |
|---|---|
URL ๊ฒฝ๋ก์ {}๋ก ํฌํจ๋จ | Path Parameter |
| ํจ์ ๋งค๊ฐ๋ณ์์ง๋ง Path์ ์์ | Query Parameter |
| ๊ธฐ๋ณธ๊ฐ ์์ | ํ์ |
| ๊ธฐ๋ณธ๊ฐ ์์ | ์ ํ |
| ๊ธฐ์ค | Path Parameter | Query Parameter |
|---|---|---|
| ์ญํ | ๋ฆฌ์์ค ์๋ณ | ์กฐ๊ฑด / ์ต์ |
| ์์น | URL ๊ฒฝ๋ก | ? ๋ค |
| ํ์์ฑ | ๊ฑฐ์ ํญ์ ํ์ | ๋๋ถ๋ถ ์ ํ |
| ์๋ฏธ | ๋ฌด์์ ๋ณผ์ง | ์ด๋ป๊ฒ ๋ณผ์ง |
๐ฏ ๋ฆฌ์์ค๋ฅผ ํน์ ํ๋ฉด Path, ์กฐ๊ฑด์ ๋ฐ๊พธ๋ฉด Query
โ
Pagination โ Query (page, limit)
โ Search / Filter โ Query
โ ๋ฆฌ์์ค ID โ Path
โ ๊ธฐ๋ณธ๊ฐ ์๋ Query = ํ์
โ ํ์ ํํธ ํ๋๋ก
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ํ์ ๋ณํ | "1" โ 1, "true" โ True |
| ๊ฒ์ฆ | ์๋ชป๋ ๊ฐ ์๋ ์๋ฌ |
| ๋ฌธ์ํ | /docs ์๋ ์์ฑ |
| ํ ์คํธ | ๋ธ๋ผ์ฐ์ ์์ ์ฆ์ ๊ฐ๋ฅ |
? ๋ค์ ์ค๋ ์กฐ๊ฑด ๊ฐ