Post

FastAPI 공식문서 따라하기[3] - 경로 매개변수

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로 받아오기 때문이다.

This post is licensed under CC BY 4.0 by the author.