Skip to content

2. First Steps


1. First Steps

  • 다음과 같이 간단하게 FastAPI 파일을 작성할 수 있다.


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


  • 위의 코드를 main.py 파일에 복사한다.


  • 그리고 다음과 같이 라이브 서버를 실행한다.


uvicorn main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [99883] using statreload
INFO:     Started server process [99885]
INFO:     Waiting for application startup.
INFO:     Application startup complete.


Note

uvicorn main:app은 다음을 의미한다.


  • main: main.py 파일(Python "모듈")이다.
  • app: main.py 내부에 app = FastAPI() 라인으로 생성된 객체이다.
  • --reload: 코드 변경 후 서버를 다시 시작하며, 개발용으로만 사용한다.


  • 출력을 보면 다음과 같은 라인이 있는데, 이 라인은 로컬 컴퓨터에서 앱이 제공되는 URL을 보여준다.


INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)


2. Check it

  • 브라우저를 열어 http//127.0.0.1:8000에 접속해보면, 다음과 같은 JSON response를 볼 수 있다.


{
  "message": "Hello World"
}


3. Interactive API docs

  • 이제 http://127.0.0.1:8000/docs로 이동해보면, Swagger UI에서 제공되는 자동 대화형 API 문서가 표시되는 것을 볼 수 있다.


001


4. Recap, step by step

1) Step 1: import FastAPI

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


  • FastAPI는 API에 대한 모든 기능을 제공하는 Python 클래스이다.


Note

  • FastAPIStarlette에서 직접 상속되는 클래스이다.
  • FastAPI에서도 Starlette의 모든 기능을 사용할 수 있다.


2) Step 2: create a FastAPI "instance"

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


  • 여기서 app 변수는 클래스 FastAPI의 "인스턴스"가 된다.
  • app 변수는 모든 API를 생성하기 위한 상호작용의 주요 지점이 될 것이다.
  • 또한 이 app 변수는 다음 커맨드의 uvicorn이 참조한 것과 동일하다.


uvicorn main:app --reload


  • 만약 다음과 같이 변경할 수도 있다.


from fastapi import FastAPI

my_awesome_api = FastAPI()

@my_awesome_api.get("/")
async def root():
    return {"message": "Hello World"}


  • 위의 코드를 main.py 파일에 넣고, 다음과 같이 uvicorn을 호출한다.


uvicorn main:my_awesome_api --reload


3) Step 3: create a path operation

(1) Path

  • 여기서 "Path"는 첫 번째 /에서 시작하는 URL의 마지막 부분을 나타낸다.


  • 예를 들어, 다음과 같은 URL에서


https://example.com/items/foo


  • path는 다음과 같다.


/items/foo


Note

  • "path"는 일반적으로 "endpoint" 또는 "route"라고도 한다.


(2) Operation

  • 여기서 "Operation"은 다음의 HTTP 메소드 중 하나를 나타낸다.


1] POST

2] GET

3] PUT

4] DELETE

5] OPTIONS

6] HEAD

7] PATCH

8] TRACE


  • HTTP 프로토콜에서 이러한 메소드 중 하나 이상을 사용하여 각 path와 통신할 수 있다.
  • API를 빌드할 때 일반적으로 이러한 특정 HTTP 메소드를 사용하여 특정 작업을 수행한다.
  • 일반적으로는 다음의 HTTP 메소드를 사용한다.


1] POST

  • 데이터를 생성한다.

2] GET

  • 데이터를 읽는다

3] PUT

  • 데이터를 업데이트한다.

4] DELETE

  • 데이터를 삭제한다.


  • 따라서 OpenAPI에서는 각 HTTP 메소드를 "operation"이라고 부르며, "operations"라고도 부른다.


(3) Define a path operation decorator

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


  • @app.get("/")은 FastAPI에게 바로 아래의 함수가 다음과 같은 request 처리를 담당한다고 알려준다.


1] path는 /이다.

2] get operation을 사용한다.


Note

  • Python의 @something 구문을 데코레이터라고 한다.
  • 데코레이터는 아래의 함수를 취하여 무언가를 수행하는 역할을 한다.


  • get operation 외의 다음과 같은 operations도 사용할 수 있다.


1] @app.post()

2] @app.put()

3] @app.delete()

4] @app.options()

5] @app.head()

6] @app.patch()

7] @app.trace()


4) Step 4: define the path operation function

  • "path operation function"은 다음을 의미한다.


1] path: /이다.

2] operation: get이다.

3] function: 데코레이터(@app.get("/")) 아래에 있는 함수이다.


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


  • 위의 코드를 보면, root() 함수는 GET operation을 사용하여 URL "/"에 대한 request을 수신할 때마다 FastAPI에 의해 호출된다.
  • 또한 root() 함수 앞에 async 키워드가 붙어 있기 때문에 비동기 함수이다.


  • 물론, 다음과 같이 async def 대신 일반 함수로 정의할 수도 있다.


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Hello World"}


5) Step 5: return the content

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


  • dict, list, str, int 등의 값으로 리턴할 수 있다.
  • 또한 Pydantic 모델을 반환할 수도 있다.

References