FastAPI 공식문서 따라하기[3] - 경로 매개변수
https://fastapi.tiangolo.com/ko/ 공식문서 따라하는 글
☑️ 1. 경로 매개변수
- 매개변수를 경로안에 선언할 수 있다. SpringMVC와 비슷한 문법
1
2
3
4
5
6
7
8
#main.py
from fastapi import FastAPI
kmsapp = FastAPI()
@kmsapp.get("/computers/{computer_id}")
async def read_com(computer_id) :
return {"computer_id : " : computer_id}
실행
1
uvicorn main:kmsapp --reload
http://127.0.0.1:8000/computers/123
결과
☑️ 2. 타입이 있는 매개변수
- 타입을 선언할 수 있다.
1
2
3
4
5
6
7
8
from fastapi import FastAPI
kmsapp = FastAPI()
@kmsapp.get("/computers/{computer_id}")
#바뀐 부분
async def read_com(computer_id : int) :
return {"computer_id : " : computer_id}
computer_id
는 int로 선언이 되었다. 여기서 문자열로 입력할 시 FastAPI
가 타입을 검증하여 에러를 리턴한다.
결과
http://127.0.0.1:8000/computers/4
1번과 달리
"4"
가 아닌4
로 되어있는걸 확인할 수 있다.
만약 파라미터로 4.2
를 넘기면
http://127.0.0.1:8000/computers/4.2
1
{"detail":[{"loc":["path","computer_id"],"msg":"value is not a valid integer","type":"type_error.integer"}]}
메시지를 볼 수 있다.
☑️ 3. Pydantic
- 모든 데이터 검증은
Pydantic
에서 내부적으로 수행한다.
순서 문제
만약 /computers/kmscom
이라는 경로와 /computers/{computer_name}
이라는 경로가 있다면 뭐부터 선언해야할까?
당연할 수 있지만 상세히 명시한 /computers/kmscom
을 먼저 선언해야한다. 그렇지 않으면 computers/{computer_name}
에 kmscom
이 매핑이 될 것이다.
예제
첫 상황
1
2
3
4
5
6
7
8
9
10
11
from fastapi import FastAPI
kmsapp = FastAPI()
@kmsapp.get("/computers/kmscom")
async def read_comkms():
return {"kmscomputer"}
@kmsapp.get("/computers/{computer_name}")
async def read_com(computer_name : str) :
return {"computer_name : " : computer_name}
확인
http://127.0.0.1:8000/computers/kmscom
결과
두번째 상황
1
2
3
4
5
6
7
8
9
10
11
from fastapi import FastAPI
kmsapp = FastAPI()
@kmsapp.get("/computers/{computer_name}")
async def read_com(computer_name : str) :
return {"computer_name : " : computer_name}
@kmsapp.get("/computers/kmscom")
async def read_comkms():
return {"kmscomputer"}
확인
http://127.0.0.1:8000/computers/kmscom
결과
☑️ 4. 사전정의 값
Enum
을 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from enum import Enum
from fastapi import FastAPI
kmsapp = FastAPI()
class Animal(str, Enum):
cat = "cat"
dog = "dog"
lion = "lion"
tiger = "tiger"
@kmsapp.get("/animals/{animal_name}")
async def getanimal(animal : Animal):
#열거형 멤버비교
if animal == Animal.cat :
return {"animal_name " : animal, "type" : "goyang-i"}
#열거형 값 가져오기
if animal.value == "dog" :
return {"animal_name " : animal, "type" : "gae"}
#열거형 멤버 반환
return {"animal_name" : animal, "type" : "tiger | lion"}
Enum
은 python 3.4이후로 사용이 가능하다.
if
문에 비교 대상들을 어떻게 지정하고 있는지 봐야한다.
Swagger
에서 테스트 하면 된다. 이런Enum
보는것도 지원한다니..
<localhost:8000/docs>
결과
Animal.cat.value
로도 접근이 가능하다.
☑️ 5. 파일 경로를 포함하는 경우
Starlette
에서 제공하는 옵션을 사용하면 path
를 포함하는 경로 매개변수를 선언 할 수 있다.
1
/files/{file_path:path}
예제
1
2
3
4
5
6
7
8
9
from fastapi import FastAPI
kmsapp = FastAPI()
@kmsapp.get("/files/{file_path:path}")
async def read_file(file_path: str):
return {"file_path": file_path}
명시적으로 알려주는 것이다.
왜냐하면 저렇게 명시하지 않는다면 JSON으로 값을 받아올텐데, 명시한다면
Form Data
로 받아오기 때문이다.