이번 글에서는 FastAPI로 저번 시간 간단하게 실행해본 코드를 짤막하게 분석해 보고, 각 코드가 무엇을 의미하는지 살펴보겠다. 그러면 먼저 가장 기본적인 코드부터 살펴보도록 하겠다.
main function
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def main():
return {"message": "Hello world!"}
위으 코드는 이번 글에서 사용할 함수이며, FastAPI 서비스를 더욱 크게 만들기 위한 첫 걸음이기도 하다. 가장 눈여겨 볼 점은 바로 app = FastAPI()부분이다.
app = FastAPI()
이 라인은 FastAPI의 가장 기본타입이 되는 코드다. 변수에다가 FastAPI 클래스를 선언하고 할당함으로서 FastAPI 인스턴스의 대부분 메소드 등등을 사용할 수 있습니다. 코드 안에는 다음과 같이 구현되어다.
많은 코드들이 이 클래스에 포함되어있지만, 이 코드를 전부 공부할 필요는 없다. 그저 이렇게 구현되어있고, 이러한 파라메터가 있다 정도로 인지해두면 좋다. 그 외에는 크게 신경 쓸 필요가 없다. 그렇다면 이제 본격적으로 메인이 되는 async def main()코드를 살펴보도록 하겠다.
@app.get("/")
async def main():
return {"message": "Hello world!"}
파이썬 데코레이터가 메인 함수 위에 있는 것을 볼 수 있을 겁니다. 파이썬 데코레이터는 굉장히 편리하고 유용한 툴이지만, 여기서는 넘어가고 나중에 다뤄보도록 하겠다. 간단하게, 데코레이터는 함수에 삽입되지만, 함수의 기능을 해치지 않고 함수를 파워업 시켜준다고 생각하면 좋다.
그리고 app의 메소드로 get("/")을 볼 수 있을 겁니다. 이 코드가 의미하는 것은 "누군가 FastAPI 서버를 부를는데, 그것이 HTTP GET Method이고 url이 아무것도 없이 "/"로 끝나는 엔드포인트면 정보를 넘겨주겠다.", 입니다. HTTP, Rest, RestFul API에 대해서는 나중에 설명하도록 하다.
이로써 당신만의 서버를 만들게 되었습니다! 그러면 정보를 어떻게 얻어올 수 있을까요?
http://localhost:8000/
서버를 실행시킨 다음에 위의 주소를 브라우저에 치면 코드에 넣은 텍스트가 출력되는 것을 확인할 수 있다.
FastAPI query parameter
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
가끔씩 url에 물음표가 있는 것을 봣을 것이다. 이 물음표의 의미는 "내가 쿼리 파라메터를 넘길 것이다."를 의미하고 이런식으로 쿼리문을 넘길 수 있다. 위의 코드에서는 q 변수로 된 부분이 Type Hinting되어있는 것을 볼 수 있다. 이 부분은 기본적으로 q라는 쿼리 파라메터를 받겠다는 소리이며 그 값이 있어도 없어도 된다는 소리이다. 그래서 기본 q의 값은 None으로 설정되어 있다.
http://localhost:8000/items/1?q=hello
여기서 "q"가 변수가 되며 "hello"는 값이 된다. 그리고 브라우저에 들어가면 텍스트에 값이 찍혀있는 것을 확인할 수 있다.
FastAPI pydantic and Request Body
Pydantic은 데이터 검증 패키지로 이를 통해 리퀘스트 바디를 검증할 수 있다.
class User(BaseModel):
id: int
message: Optional[str] = None
creation_date: datetime.datetime
이 코드에서 다음과 같은 정보를 확인할 수 있습니다.
- id와 creation_date는 필수다
- message는 필수까지는 아니지만 원하면 넣을 수 있다.
만약 creation_date를 없이 리퀘스트를 보내면 다음과 같은 경고를 받습니다!
{
"detail": [
{
"loc": [
"body",
12
],
"msg": "Expecting property name enclosed in double quotes: line 3 column 1 (char 12)",
"type": "value_error.jsondecode",
"ctx": {
"msg": "Expecting property name enclosed in double quotes",
"doc": "{\n\t\"id\": 1,\n}",
"pos": 12,
"lineno": 3,
"colno": 1
}
}
]
Pydantic의 장점이자 가장 유용한 부분이기도 하다. 리퀘스트 데이터 증명을 쉽게할 수 있다. 만약 원하는 정보, 꼭 들어가야되는 정보가 있다면 Class에다가 변수를 선언해서 넣어주면 된다.
다음 글에서는 Pydantic에 대해 좀 더 깊게 파보겠다.
'Python > FastAPI' 카테고리의 다른 글
Events that tiangolo(Sebastián Ramírez) who is creator of FastAPI went through, and My Opinion (0) | 2023.01.15 |
---|---|
FastAPI 알아보기 - 의존성 주입, Dependencies, Dependency Injection (1) | 2023.01.06 |
FastAPI 알아보기 - Schema 다루기 혹은 DTO, Entity, DAO 등 (2) | 2023.01.05 |
FastAPI 알아보기 - Pydantic과 직렬화 (0) | 2022.12.24 |
FastAPI 준비 - WSL2에 Pyenv 및 FastAPI 설치하기 (0) | 2022.12.23 |