Python/FastAPI / / 2022. 12. 23. 14:06

FastAPI 준비 - FastAPI실행, Query Parameter, Request Body

이번 글에서는 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에 대해 좀 더 깊게 파보겠다.

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유