Post

FastAPI 공식문서 따라하기[4] - 쿼리 매개변수

https://fastapi.tiangolo.com/ko/ 공식문서 따라하는 글

☑️ 1. 쿼리 매개변수

기본적으로 함수에 매개변수를 선언할 때에 query param으로 인식하여 처리한다.

예제

1
2
3
4
5
6
7
8
9
10
from fastapi import FastAPI

query_param_app = FastAPI()

dia_bemember_db = [{"name" : "ksw"}, {"name" : "gg"},{"name" : "kms"},{"name:" : "wj"}]

@query_param_app.get("/members/")
async def read_mem(skip: int = 0, limit: int = 10):
    return dia_bemember_db[skip : skip + limit]

이 예제에서 ‘default’값인

http://127.0.0.1:8000/members

http://127.0.0.1:8000/members/?skip=0&limit=10

와 같은 파라미터로 처리되어 들어간다.

쿼리파라미터에 대해 다루지는 않겠지만.. 살짝 적자면 &을 구분자로 ?을 통해 다음 문구가 쿼리파라미터라는 것을 알려준다.

FastAPI는 다음과 같은 프로세스를 수행한다.

  • 편집기 자동완성
  • 데이터 파싱
  • 데이터 검증
  • 자동 문서화 -> Swagger, ReDoc

☑️ 2. 기본 값

기본값은 Request QueryParam 관한 내용이므로 자세히 다루지 않겠다.

1
2
3
http://127.0.0.1:8000/members/  => 1.skip, limit값은?
http://127.0.0.1:8000/members/?skip=0&limit=2 => skip, limit값은?
http://127.0.0.1:8000/members/?skip=20 => skip, limit값은?
  • 1 : skip=0, limit=10
  • 2 : skip=0, limit=2
  • 3 : skip=20, limit=10

이유를 모르겠다면 QueryParam에 대해 학습이 필요하다.


☑️ 3. 선택적 매개변수

Optional을 통해 매개변수 필수값 여부를 설정해줄 수 있다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
from typing import Optional
from fastapi import FastAPI


query_param_app = FastAPI()

@query_param_app.get("/members/{member_name}")
async def read_memone(member_name: str, member_age : Optional[int] = None) :
    if(member_age) : 
        return{"name" : member_name, "age : " : member_age}
    return {"name" : member_name}

실행

http://127.0.0.1:8000/members/kms?member_age=25

http://127.0.0.1:8000/members/kms

여기서 member_ageOptional = None으로 지정되어, 필수값이 아니기에 둘다 요청에 성공한다.

만약 Optional[int]로만 지정하고 http://127.0.0.1:8000/members/kms에 접근한다면?

결과

member_age값도 입력하라고 나온다.


☑️ 4. 쿼리 매개변수 형변환

bool타입은 어떻게 처리할까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from typing import Optional
from fastapi import FastAPI


query_param_app = FastAPI()

@query_param_app.get("/members/{member_name}")
async def read_membool(member_name: str, query: Optional[str] = None, iskms: bool = False):
    name = {"member_name": member_name}
    if query:
        name.update({"query": query})
    if not iskms:
        name.update(
            {"description": "iskms is false how are you?"}
        )
    return name

전부 True처리 한다.

참고로 .update()는 해당 객체 뒤에 내용을 추가합니다.


☑️ 5. 여러 경로/쿼리 매개변수

여러 경로 매개변수와 쿼리 매개변수를 동시에 선언할 경우 FastAPI는 이를 감지한다. 매개변수 이름으로 감지한다.

1
2
3
4
5
6
7
8
9
10
11
@query_param_app.get("/members/{member_name}/items/{item_id}")
async def read_membool(member_name: str,item_id: str, query: Optional[str] = None, iskms: bool = False):
    name = {"member_name": member_name, "have item_id " : item_id}
    if query:
        name.update({"query": query})
    if not iskms:
        name.update(
            {"description": "iskms is false how are you?"}
        )
    return name

실행

http://127.0.0.1:8000/members/kms/items/345?iskms=true

결과


☑️ 6. 여러 경로/쿼리 매개변수

쿼리 매개변수도 필수값으로 지정할 수 있다는 것.

1
2
3
4
5
6
7
8
9
from typing import Optional
from fastapi import FastAPI

query_param_app = FastAPI()

@query_param_app.get("/members/{member_name}")
async def read_member(member_name : str, iskms : bool):
    member = {"name" : member_name, "iskms?" : iskms}
    return member

성공한 테스트

1
http://127.0.0.1:8000/members/kms?iskms=y

실패한 테스트

1
http://127.0.0.1:8000/members/kms

이 경우는 필수 값인 iskms를 매개변수로 넣지 않았으므로

1
{"detail":[{"loc":["query","iskms"],"msg":"field required","type":"value_error.missing"}]}

라는 메세지를 볼 수 있다.

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