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=102
: skip=0, limit=23
: 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_age
가 Optional = 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
- http://127.0.0.1:8000/members/kms?iskms=1
- http://127.0.0.1:8000/members/kms?iskms=True
- http://127.0.0.1:8000/members/kms?iskms=true
- http://127.0.0.1:8000/members/kms?iskms=on
- http://127.0.0.1:8000/members/kms?iskms=yes
- http://127.0.0.1:8000/members/kms?iskms=y
전부 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"}]}
라는 메세지를 볼 수 있다.