심화 스터디/데이터 엔지니어링 스터디

[3차시/15기 공도웅] Fast API

우주베게 2023. 3. 26. 01:11

Background

백엔드 엔지니어 입장에서 API 개발보다 중요시 여겨지는 것은 바로 API를 사용할 수 있도록 만든 문서 작업이다. 하지만 엔지니어가 요구 사항에 따른 기능 개발과 테스트 코드를 통한 품질 관리에 주력을 두다보니 문서 작업에서 소홀해지기 마련이다. 이렇게 되면 이를 사용하는 프론트 엔지니어들은 버그가 고쳐지기 이전이나 요구 사항의 변경으로 인해 바뀐 API 때문에 사용에 혼란을 겪게 된다.

 

위 그림에서 보다시피 백엔드 엔지니어가 형상 관리 시스템에 변경된 소스 코드를 반영해 서버 배포를 자동화 했다. 하지만 API 문서까지 최신화가 되지 않기 때문에 같이 협업을 하는 프론트 엔지니어가 기존에 받은 문서에 의존을 하게 돼 업무 이슈 발생도가 증가하게 된다.

 

 

📌 Flask의 단점

 

Flask는 마이크로프레임워크로는 나은 선택이지만 요청/응답 등 데이터 검증의 처리에 있어서 백엔드 엔지니어의 일을 가중시킨다. 또 자주 변화하는 코드에 일일이 문서를 변경하는 수작업에서 불리하다는 단점이 있다.

 

 

🛠 반면, FastAPI는?

 

백엔드 엔지니어 입장에서 위와 같은 이슈를 해결하기 위해 문서의 자동화가 필요하다.코드의 변화에 따라 발생하는 요청/응답 스키마를 자동으로 문서화해 제공하고, 이를 프론트 엔지니어가 백엔드 애플리케이션의 코드 변화에도 즉각 대응할 수 있도록 한다면 위와 같은 문제를 해소할 수 있을 것이다. FastAPI는 이러한 파이프라인을 제공해줌으로써 백엔드 엔지니어가 문서 작업에 할애하는 시간을 줄이고, 오직 코드에만 집중하도록 해 업무 효율을 증진시킬 수 있다.

 

백엔드 엔지니어가 FastAPI를 이용해 애플리케이션을 개발하면 기본적으로 엔지니어가 만든 EndPoint를 제외하고, 아래의 3가지 EndPoint가 생성된다.

 

  • /docs
  • /redoc
  • /openapi.json

 

위 3가지 엔드포인트는 API에 대한 문서를 위한 것이다. 기본적으로 FastAPI는 OpenAPI를 채택하고 있으며 이를 기반으로 자신의 코드를 읽어 OpenAPI 규격에 맞는 json 파일을 만들어준다. 이를 기반으로 FastAPI에 내장돼 있는 Swagger, Redoc이 문서를 시각화 해줌으로써 백엔드 엔지니어가 문서 작업에 할애하는 시간을 대폭 줄일 수 있다.

 

 


what is Fast API

Fast API is a Python web-framework for building modern RESTful APIs

Fast API has its own approach when dealing with URLs and receiving and sending data

Fast API는 python으로 동작하는 Backend Framework 이다.

 

 

📌 특징

  • 빠르다 (Starlette과 Pydantic 덕분에) Node.js 및 Go와 대등할 정도로 매우 높은 성능
  • 높은 생산성 (타 프레임워크에 비해 짧은 코드로 빠르게 개발 가능)
  • 쉽다 (파이썬으로 구동 되기에 직관적이고 배우기 쉬움)
  • 문서 자동화 (API Swagger, ReDoc 등을 사용하여 자동으로 대화형 API 문서를 제작해줌)

Fast API의 구성요소 (Starlette, Pydantic)

 

🗣 According to, Fast API 공식문서..

 

  • 대부분의 웹 서비스 처리를 위해 Starlette를 사용하고, 대부분의 데이터 처리를 위해 Pydantic을 사용하다.
    • Starlette: 비동기 웹 서비스를 구축하는데 이상정인 경량 ASGI 프레임워크/툴킷
    • Pydantic: 파이썬 타입 어노테이션을 사용해서 데이터를 검증하고 설정들을 관리하는 라이브러리

 


 

🔑  Starlette (Web Application Server)

 

비동기 웹 서비스를 구축하는데 이상정인 경량 ASGI 프레임워크/툴킷. Starlette는 비동기적으로 실행할 수있는 Web application server. Starlette는 Uvicorn 위에서 실행된다.

 

 

   🔍 비동기 프로그래밍이 어렵지만 중요한 이유?

 

 

   서버 응답 기다릴 때 다른 인터랙션에 반응하지 않는다면 화면이 멈춰있을 것.

   👉 비동기 프로그래밍을 통해 서버 응답 기다리는 동안 다른 액션도 취해줘야 한다.

(왼쪼성공&실패의 경우가 섞여서 처리되고, 매번 비동기 호출시마다 에러처리를 해줘야 함.

(오른쪽) 성공하는 경우만 다루고, 실패하는 경우는 catch 절에서 분리해 처리한다. '실패'하는 경우에 대한 처리를 외부에 위임할 수 있다.

 

좋은 비동기 코드?

성공/실패의 경우를 분리해 처리한다 👉 비즈니스 로직을 파악하기 쉽다.

 

➡️ 성공&실패하는 경우가 섞여서 처리된다

➡️ 실패하는 경우에 대한 처리를 외부에 위임하기 어렵다.

↪️ 여러 개의 비동기 작업이 동시에 실행된다면 even worse 🙅‍♀️

 

 

🔍 WSGI와 ASGI의 차이가 뭘까?

 

오래전부터 파이썬 웹 애플리케이션은 웹 서버와 통신할 때, 웹 서버 게이트웨이 인터페이스 (WSGI) 표준을 따랐다. WSGI는 2003년에 처음 도입돼 2010년에 업데이트됐으며 파이썬 버전 2.2에서는 네이티브 기능을 이용해 쉽게 구현할 수 있게 됐다. 결과적으로 WSGI는 모든 주요 파이썬 웹 프레임워크에 빠르게 도입돼 파이썬을 사용한 웹 개발의 초석이 됐다.

 

 

💡 비동기 서버 게이트웨이 인터페이스 (ASGI)의 등장

 

ASGI는 WSGI와 마찬가지로 파이썬 웹 애플리케이션과 웹 서버 간의 공통적인 인터페이스를 기술한다. WSGI와 다른 점은 애플리케이션당 여러 개의 비동기 이벤트를 허용한다는 것이다. 또한 ASGI는 동기 앱과 비동기 앱을 모두 지원한다. ASGI를 사용해 새로운 비동기 웹 앱을 구축하는 것뿐만 아니라 오래된 동기 WSGI 웹 앱을 ASGI로 마이그레이션할 수도 있다.

 

 

💡 어떻게 비동기 동작이 가능한가?

 

 

async def application(scope, receive, send):
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ],
    })

    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
    })

 

 

ASGI의 가장 큰 특징은 함수 전반에서 비동기 메타포를 사용한다는 것이다. 함수 자체는 async이며 HTTP 헤더와 응답 본문을 별도의 두 가지 await send() 명령으로 보낸다. 따라서 함수 자체와 이 함수의 send 명령은 아무것도 차단하지 않는다. 즉, 다른 많은 연결의 application 및 send 호출과 동시에 교차가 가능하다.

앞선 예제에서는 receive를 사용하지 않지만 이것도 async 함수다. 다른 작업을 차단하지 않고도 요청 본문을 받을 수 있다. 이 방법으로 요청과 응답을 증분적으로 서버에서 송수신할 수 있다. WSGI에서는 매끄럽게 하기 어렵거나 아예 불가능했다.

 

 

💡 ASGI를 지원하는 웹 프레임워크

 

스탈렛(Starlette)과 패스트API(FastAPI) : 최근 주목받는 프레임워크이며(Fast API가 스탈렛을 기반으로 함)둘 다 비동기 우선이므로 ASGI를 지원한다. 파이썬을 위한 가장 현대적인 최첨단 웹 프레임워크다.

 

 

🔍 ASGI를 구현한 웹서버 Uvicorn

 

 

$ pip install fastapi
$ pip install uvicorn

uvloop와 httptools 라는 것들을 이용해서 ASGI를 구현한 서버이다.uvloop는 NodeJS V8 엔진에서 사용하는 libuv를 기반으로 Cython으로 작성되었다고 한다.실제 성능 면에서 NodeJS와 다른 Python 비동기 프레임워크보다 훨씬 빠르다고 한다.

 

 

🔍 multi process 관리가 가능한 Gunicorn

 

Uvicorn은 단일 프로세스로 비동기 처리가 가능하지만, 결국 단일 프로세스라는 한계가 있기 때문에 처리량을 더 늘리기 위해서는 멀티 프로세스를 활용해야 한다. Gunicorn 은 WSGI 서버이자 프로세스 관리자 역할을 수행한다.

 

📍 프로세스 관리

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업이라는 용어와 거의 같은 의미로 쓰인다. 여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다.

 

 

🔍 Uvicorn으로 Gunicorn 동작하기

 

비슷한 원리로 Uvicorn이 Gunicorn의 워커(프로세스)로서 동작하게 할 수 있다.Uvicorn은 자체적으로 Gunicorn Worker Class(uvicorn.workers.UvicornWorker)를 포함하고 있는데 이 클래스 경로를 Gunicorn 실행 명령어(-k 파라미터)에 전달하면 된다.

 

만약 Kubernetes 같은 컨테이너 오케스트레이션 시스템을 사용하고 있다면 굳이 Gunicorn 같은 프로세스 매니저가 필요하지 않을 수도 있다.그 이유는 도커 이미지를 구성할 때 메인 프로세스로 Uvicorn을 단일 프로세스로 지정한다고 해도 Kubernetes의 ReplicaSet을 이용해 컨테이너 복제를 조절할 수 있으며, 좀 더 정확하고 단순하게 도커 컨테이너를 관리, 관측할 수 있다는 장점이 있다.

 


 

🔑 Pydantic

pydantic은 파이썬 타입 주석(type annotations)을 사용하여 데이터의 유효성을 검증해주는 파이썬 라이브러리이다.

 

🔍 데이터 유효성 검증

 

pydantic의 BaseModel 클래스를 상속받아서 User라는 클래스를 만드는데, name의 타입은 str로, age의 타입은 int로 정해준다. 이렇게 한 다음 데이터 타입을 맞게 해서 user1 객체를 생성하면 에러 없이 제대로 생성되지만, 데이터 타입에 맞지 않는 user2 객체를 생성하면 에러가 난다.

이때, User 객체의 age 값은 정수여야 한다는 사용자 친화적인 에러 메시지를 던져준다.

 

 

🔍 데이터 파싱 (형변환)

 

위 코드를 실행하면 정수 데이터가 들어가야할 age에 '10'이라는 문자열 데이터가 들어갔음에도 정수 10으로 데이터 형 변환이 이뤄진다. 데이터를 적절히 파싱해낸 것.

 

🔍 데이터 클래스와의 차이점?

  • 데이터 유효성 검증이 안됨 : 데이터클래스에서는 타입 힌트 (타입 어노테이션)의 역할만 수행

  • 데이터 파싱 (형변환) 또한 안됨

 

 

🔍 그래서 왜 좋은데?

  • [ pydantic을 사용하는 이유 ]
    • 1. 데이터 모델을 정의할 수 있는 간단한 syntax
      • BaseModel 클래스에서 상속된 클래스 내에서 데이터를 정의할 수 있다. pydantic model은 데이터를 수집하고 구문 분석하고 데이터에 정의된 필드가 제약 조건을 준수하는지 확인하는 구조다.
    • 2. 사용자 친화적 error message
    • 3. filed customization (custom validators)
      • pydantic을 사용하여 각 필드를 Field클래스 내부에 wrapping하여 기본적으로 유효성 검사를 추가할 수 있다.
    • 4. 많은 유용한 method들을 제공
    • 5. 환경변수값을 parsing하여 사용 가능
      • env파일에서 환경 변수를 읽고 BaseSettings클래스 내에서 직접 구문 분석이 가능하다.

유효성 검증은 제공된 유형 및 제약 조건을 준수하는 모델을 구축하는 목적을 달성하기 위한 수단. 즉, pydnatic은 입력 데이터가 아닌 출력모델의 유형과 제약 조건을 보장한다. 예를 들어, GET user/123 을 호출할 시, 123은 실제 문자열이지만, 웹 어플리케이션은 문자열인지 정수형인지 알 수 없다. 이 때, Pydantic을 사용하면 개발자가 원하는 타입으로 받을 수 있다.

 


 

🪄 Endpoint

Endpoint 란 API가 서버에서 리소스에 접근할 수 있도록 가능하게 하는 URL, 클라이언트의 요청이 수행되는 곳이다.

 

🔍 같은 URL에 대해서도 다른 요청이 가능하게

 

같은 URL들에 대해서도 다른 요청을 하게끔 구별하게 해주는 항목이 바로 'Endpoint'입니다. 각각 GET, PUT, DELETE 메소드에 따라 다른 요청을 하는 것을 알 수 있습니다. API가 두 시스템(어플리케이션)이 상호작용할 수 있게 하는 프로토콜의 총집합이라면, 결국 Endpoint 란 API가 서버에서 리소스에 접근할 수 있도록 가능하게 하는 URL, 클라이언트의 요청이 수행되는 곳이라 할 수 있겠다.

 

🔍 API 엔드포인트와 클라이언트는 어떻게 인증할까?

 

제대로 설계된 API는 아무에게서나 API 호출을 수락하지 않는다. 이는 API 서버가 공격자로부터 악의적인 데이터를 수신하게 할 수 있기 때문이다. 또한, API 사용에는 비용이 드는 경우가 많기 때문에 이 경우 API 서버에서 API 요청이 유료 클라이언트에게서 오는 것인지 확인해야 한다. 이러한 이유로 API 서버는 호출을 보내는 API 클라이언트가 알려져 있고 신뢰할 수 있는지 확인해야 한다. 이것은 인증을 통해 수행된다. 인증은 신원을 확인하는 프로세스이다.API 엔드포인트가 인증을 시행하는 데에는 네 가지 주요 방법이 있다.

  1. API 키: API 클라이언트는 키, 또는 그들과 API 서비스만 알고 있는 고유한 문자열을 할당받는다. API 클라이언트가 API 호출을 서버 엔드포인트에 보낼 때, 호출이 어디에서 왔는지 서버가 알 수 있도록 키를 포함시킨다.
  2. 기본 인증(사용자 이름 및 비밀번호): 키 접근과 마찬가지로 API 클라이언트는 API 서비스에 사용자 이름과 비밀번호를 설정하고 API 호출에 이러한 자격 증명을 포함한다.
  3. OAuth 토큰: API 서버는 클라이언트의 인증을 요구하는 대신, OAuth 프로토콜을 사용하여 신뢰할 수 있는 인증 서버에서 인증 토큰을 받을 수 있다.
  4. mTLS(Mutual TLS): TLS는 웹페이지를 로드할 때 클라이언트와 서버 간에 인증된 연결을 생성하는 프로토콜이다. 이는 또한 API 통합의 양쪽을 인증할 수 있다.

https://www.cloudflare.com/ko-kr/learning/security/api/what-is-api-endpoint/

 


 

🚀 실습

#1. import fast API from FastAPI
from fastapi import FastAPI

# This allows Uvicorn to identify that we are creating a new application of fast API
# Uvicorn is the web server we use to start a FastAPI application

#2. Acknowledging that this is going to be a fast API application
# where we're setting app to what we're importing for fast API
app = FastAPI()

BOOKS = [
    {'title': 'Title One', 'author':'Author One','category':'science'},
    {'title': 'Title Two', 'author': 'Author Two', 'category': 'science'},
    {'title': 'Title Three', 'author': 'Author Three', 'category': 'history'},
    {'title': 'Title Four', 'author': 'Author Four', 'category': 'math'},
    {'title': 'Title Five', 'author': 'Author Five', 'category': 'math'},
    {'title': 'Title Six ', 'author': 'Author Six', 'category': 'math'},
]

# 3. add decorator : this allows fast API to know that at this path
# we are going to be returnig the below method
@app.get('/books')
async def read_all_books():
    return BOOKS

# 4. open up the terminal, make sure your fastapi environment been activated
uvicorn books:app --reload

#books: books.py 파일 (python 모듈)
#app: the object created inside of books.py
#app = FastAPI()
#reload: 코드 변경후 서버 재시작하기. 개발환경에서만 사용할 것

 

 

🛵 비동기 코드 (coroutines)

 

비동기식 코드는 언어가 프로그램에게 코드의 특정 지점에서 다른 작업이 다른 곳에서 끝날 때까지 기다려야 함을 선언하는 방법을 가지고 있음을 의미한다.다른 작업을 기다린다는 의미를 다음과 같은 표현으로 나열할 수 있다. 코루틴은 async def 함수로 반환 된 것을 용어로 표현한 것으로, 파이썬은 함수 같이 코루틴이 시작될 수 있고 어느 시점에 끝날 지 알고, await가 있을 때마다 내부적으로 일시 중지 될 수 있다는 것도 알고 있다.

 

  • 파이썬은 “비동기 코드"를 코루틴(coroutines)를 async 와 await 으로 지원하고 있다.
  • 클라이언트가 네트워크를 통해 보낼 데이터
  • 시스템이 읽고 프로그램에 제공할 디스크의 내용
  • 프로그램이 디스크에 쓰기 위해 시스템에 제공한 내용
  • 원격 API 작업
  • 완료할 DB 작업
  • 결과를 반환하는 DB 쿼리

🛵 swagger UI

# Swagger UI makes it a lot easier for us just to be able to see all of the API endpoints that we created and being able to call them in one 


 

경로 매개변수

 

파이썬 문자열 포맷과 동일한 문법으로 매개변수를 경로에 선언할 수 있다. 경로 매개변수 item_id의 값은 함수의 item_id 인자로 전달된다.

 

What are Path Parameters

 

- Path Parameters are request parameters that have been attached to the URL

- Path Parameters are usually defined as a way to find information based on location

 

API endpoint dynamic param that’s in curly brackets need to match the naming convention that we have as our parameter in our read all books function

 


 

쿼리 매개변수

 

쿼리는 URL에서 ? 후에 나오고 **&**으로 구분되는 키-값 쌍의 집합이다.

ex) http://127.0.0.1:8000/items/?skip=0&limit=10

 

경로 매개변수의 일부가 아닌 다른 함수 매개변수를 선언할 때, 쿼리 매개변수로 자동 해석된다.

 

 

💎 API vs Library vs Framework

Library

응용 프로그램 개발을 위해 필요한 기능(함수)를 모아놓은 소프트웨어

 

○ 프로그래머가 어떠한 기능을 수행하기 위해 도움을 주는 또는 필요한 것을 제공해주는 역할을 하는 것.

○ 라이브러리는 재사용이 필요한 기능으로 반복적인 코드 작성을 없애기 위해 언제든지 필요한 곳에서 호출하여 사용할 수 있도록 Class나 Function으로 만들어진다.

○ 프로그램을 만들때 기존에 만들어진 함수들을 재활용함으로써, 프로그램의 제작 시간과 노력을 줄일 수 있다. 그리고 필요한 함수만 호출하여 사용할 수 있다.

○ 독립성을 가지고, 응용 프로그램이 능동적으로 라이브러리를 사용한다.

 

특징 : 독립성을 가진다, 응용 프로그램이 능동적으로 라이브러리를 사용

 


API : Application Programming Interface

응용 프로그램에서 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스 (ex. 프로그램 간 사이에 연결시켜주는 메뉴판의 역할)

 

○ 직역하자만 응용 프로그램을 만드는데 사용되는 interface이다. 여기서 interface란 사물간, 사람간, 또는 사람과 사물간에 상호작용을 할 수 있도록 연결해주는 장치, 방법, 형식, 공간 등을 통칭한다.

 

○ 라이브러리와 API를 혼동하지 않도록 주의하자! 실제 개발을 할 때는 여러 컴포넌트를 합쳐서 개발을 하게 되고, 각각의 컴포넌트들은 API를 가지고 있습니다. 이때 많은 컴포넌트들이 라이브러리의 형태로 제공되기 때문에 API와 라이브러리는 혼동할 수 있다. 하지만, 라이브러리는 컴포넌트 자체를 의미하고, API는 그 컴포넌트를 활용하기 위한 규약이다.

 


 

Framework (틀,뼈대 일하다)

응용프로그램이나 소프트웨어의 솔루션 개발을 수월하게 하기 위해 제공된 소프트웨어 환경

 

○ 뼈대나 기반구조라는 뜻. 응용프로그램이나 소프트웨어 구현을 수월하게 하기 위해 제공된 소프트웨어 환경이다.

○ 프레임워크만으로 실행되지 않고, 기능을 추가해야하며, 프레임워크에 의존하여 개발해야하고, 프레임워크가 정의한 규칙을 준수해야한다.

○ 프로그래밍을 진행할 때 필수적인 코드, 알고리즘 등과 같이 어느 정도 구조를 제공해주기 때문에 프레임워크를 사용하는 프로그래머는 이 프레임워크 뼈대 위에서 코드를 작성하여 프로그램을 개발하면 됩니다.

○ 프레임워크는 완성된 제품이 아닌 완성된 제품을 만들기 위해 개발자를 도와주는 또는 기반이 되는 역할을 한다. 즉, 소프트웨어의 특정 문제를 해결하기 위해 상호 협력하는 클래스와 인터페이스의 집합.

 

 : Spring, Django, Node.js, spring 프레임 워크 기반으로 웹 애플리케이션을 개발하는 과정, java를 이용해 웹 서버, 프레임 워크를 개발하는 과정

 

특징 : 상호협력하는 클래스와 인터페이스의 집합

응용 프로그램이 수동적으로 프레임워크에 의해 사용된다

 


 

 

API vs Library vs Framework

 

Library와 API의 차이점은 구현 로직의 유무이다

Library와 Framework의 차이점은 응용 프로그램의 흐름 주도권을 누가 가지고 있느냐이다.

 

○ 차이점 : 흐름을 누가 가지고 있는가의 차이이다. 프레임워크는 전체적인 흐름을 자체적으로 가지고 있어 프로그래머는 그 안에서 필요한 코드를 작성한다. 반면에 라이브러리는 프로그래머가 전체적인 흐름을 가지고 있어 라이브러리를 자기가 원하는 기능을 구현하고 싶을 때 가져다 사용할 수 있다. 프레임워크는 가져다 사용하는 개념보다는 프레임워크라는 특정 공간에 들어가서 사용한다는 느낌이 더 강하다.

 

 


 

🛎 Back-end knowledge

 

@RequestMapping

 

클라이언트 요청에 정보를 어떤 Controller가 처리할지를 매핑하기 위한 어노테이션이다.@RequestMapping에 URL을 포함하여 해당 Controller 클래스에 명시하여 사용한다.웹 브라우저에서 해당 URL이 호출되면 Controller 내부의 메서드가 호출된다. RequestMapping은 요청이 들어왔을 시에 컨트롤러와 매핑해주고, 그 컨트롤러를 실행시켜 응답을 받는 것을 알 수 있다.

 

Controller

 

웹 어플리케이션에서 컨트롤러(Controller)란 외부의 요청을 처리하는 모듈을 의미한다. 좀 더 정확하게 말하면 하나 이상의 클라이언트가 보내는 요청을 처리하고 요청을 보낸 클라이언트에게 응답을 반환하는 역할을 한다. 컨트롤러의 목적은 애플리케이션에 대한 특정 요청을 수신하는 것이다. 라우팅 메커니즘은 어떤 컨트롤러가 해당 요청을 처리할지 조정한다. 보통은 각각의 컨트롤러는 하나 이상의 경로가 있으며, 각기 다른 경로는 각기 다른 행동을 수행한다.

 

Routing

 

라우팅은 네트워크에서는 어떠한 패킷을 원하는 곳으로 보내는 행위를 가리킨다. 클라이언트가 요청한 HTTP 요청을 특정 컨트롤러로 보내는 행위를 의미하기도 함

 

 

(추가) Fast API에서 지원하는 기능들

  • Headers, Cookies, Form Fields, Files 등에 파라미터 정의 기능
  • maximum_length, regex 와 같은 validation constraints 설정 가능
  • 사용하기 쉬운 의존성 주입
  • OAuth2, JWT Tokens 및 HTTP Basic Auth 기능을 포함한 보안과 인증 기능
  • Pydantic 덕에 가능해진 중첩 JSON 모델 선언
  • Starlette 덕에 가능해진
    • WebSockets
    • GraphQL
    • requests와 pytest 를 기반으로 한 극도로 쉬운 테스트
    • CORS
    • Cookie Sessions
  •