#58.TIL | FastAPI 공식문서 따라하기(1)

Seongjae Hwang·2023년 1월 15일
0

https://slender-danger-059.notion.site/2-First-Steps-87923b1bf0634a499793c1bb300dd482

main.py

from fastapi import FastAPI

app = FastAPI()

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

다음과 같이 main.py를 구성

run server

uvicorn main:app --reload
  • main: 실행시킬 파일 (main.py)
  • app: 실행시킬 파일 내에서 생성된 객체 ( app = FastAPI() )
  • —reload: 코드에 변경사항이 생기면 서버를 재시작하는 옵션 (오직 개발계에서만 사용해야 된다.)

그 후, 다음과 같은 커맨드로 서버를 시작. 그러면 아래와 같은 메세지가 뜬다. 이 메세지는 local machine에서 app이 제공하는 URL을 나타낸다.

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

API docs

  • URL/docs (스웨거)
    • 자동으로 생성된 상호적인 API문서를 볼 수 있다.

  • URL/redoc (리독)
    • 자동으로 생성된 대안적인 API문서를 볼 수 있다.

OpenAPI

FastAPI는 API를 정의하기 위한 OpenAPI ****표준을 사용하여 모든 API에 "스키마"를 생성한다.

**Schema**

  • 무언가의 추상적인 정의 혹은 설명

API schema

  • OpenAPI 표준을 따라 API의 schema를 규정. 이 스키마에는 API paths, parameters 등을 다 포함.

Data schema

  • 스키마는 JSON처럼 어떤 데이터의 형태일 수 있기 때문에 이러한 경우 JSON 속성, 가지고 있는 데이터 타입 등을 뜻한다.

**OpenAPI and JSON Schema**

  • OpenAPI는 API에 대한 API 스키마를 정의. 또한, JSON 스키마를 사용하여 표현.

  • URL/openapi.json을 통해 가공되지 않은 OpenAPI 스키마를 확인할 수 있음.

용도

  • API 문서 생성
  • API와 통신하는 클라이언트에서 코드 자동 생성.

step by step

1. import FastAPI

from fastapi import FastAPI

app = FastAPI()

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

FastAPI는 API에 대한 모든 기능을 제공하는 파이썬 class. 또한, FastAPI는 Starlette를 직접 상속하는 class. 따라서, FastAPI로 Starlette의 모든 기능을 사용할 수 있음.

Starlette이란?

2. create a FastAPI instance

from fastapi import FastAPI

app = FastAPI()

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

app은 FastAPI 클래스의 인스턴스. 이것은 모든 API를 생성하기 위한 필수적인 지점. 물론, 이름이 꼭 app일 필요하는 없음. 단, app이 아니라고 하면 서버 실행 시 커맨드 또한 바뀌어야 함.

3. create a path operation

path(경로)

여기서 경로는 앤드포인트 or 라우트 라고도 불린다. URL의 마지막 부분. path는 관심사와 리소스를 분리하는 주요 방법.

operation(동작)

HTTP method 중 하나를 나타낸다. 다음 중 하나.

  • POST
  • GET
  • PUT
  • DELETE

이국적인 것들도 있음.

  • OPTIONS
  • HEAD
  • PATCH
  • TRACE

**Define a path operation decorator**

from fastapi import FastAPI

app = FastAPI()

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

@app.get("/")은 다음의 요청을 하는 것을 알 수 있음

  • path : /
  • method(operation) : get

@decorator
파이썬의 문법으로 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용. 아래 있는 함수를 받고 그걸 이용해 무언가 로직을 처리. @app.get("/") 데코레이터같은 경우 아래 함수가 경로 / 에 해당하는 get 동작을 하라고 알려준다.

파이썬 코딩 도장

4. **define the path operation function**

다음과 같은 함수를 **path operation function(경로 동작 함수)**라고 한다.

  • path(경로) → /
  • operation(동작) → get
  • function(함수) → 데코레이터 아래에 있는 함수.
from fastapi import FastAPI

app = FastAPI()

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

다음과 같은 함수는 비동기(async)함수이다. 당연히 앞에 async를 붙이지 않으면 일반 함수로 사용가능하다.

“async def syntac“ path operation function ?

  • 아래와 같이 awit 사용이 필요한 써드파티 라이브러리를 콜해야 한다면
    results = await some_library()
  • 경로 동작 함수에서 async def를 사용하면 된다. (await는 async def 함수내에서만 사용이 가능하다.)
    @app.get('/')
    async def read_results():
        results = await some_library()
        return results
  • 써드파티 라이브러리를 사용중이지만, await를 지원하지 않는다면 경로 동작 함수를 일반 함수로 선언하면 된다.
    @app.get('/')
    def results():
        results = some_library()
        return results
  • 어떠한 경우에도 FastAPI는 항상 비동기적으로 작동하지만, def or async def를 혼합하여 사용하여 성능을 최적화 시킬 수 있다.

Concurrency and async / await - FastAPI

5. return the content

from fastapi import FastAPI

app = FastAPI()

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

객체, 배열, 문자열, 숫자 등을 반환할 수 있다. Pydantic model도 반환할 수 있으며 ORM을 포함하여 JSON으로 자동 변환되는 객체들과 모델들도 많다.

Pydantic?

  • 출력 모델의 유형과 타입 등을 검사하고 설정하는 validation and parsing 라이브러리.
profile
Always Awake

0개의 댓글