Flask 보다 빠르고 기능이 많은 프레임워크 Fast API를 업무능력 향상과 자기개발을 위해 공부하기로 결심했다

그리하여 오늘부터 Fast API 공부 시작!

 

 

 

 


  1. Fast API란

Fast API는 빠른 성능, 타입 힌트 기반, 간결하고 직관적인 문법이 특징이다

  • 성능 및 빠른 속도 : 비동기 처리 및 Pydantic과 같은 최신 Python 라이브러리를 활용하여 빠른 속도와 뛰어난 성능을 보인다. asyncio를 활용하여 I/O 바운드 작업에서 높은 처리량과 낮은 지연시간을 가지는 특징
  • 타입힌트 기반 : Python의 타입 힌트를 사용하여 자동으로 API 문서를 생성하고, 타입 검사를 수행하여 개발자들의 안정적인 코드작성을 돕는다
  • 간결하고 직관적인 문법 : Swagger 및 OpenAPI를 자동으로 생성하며, 코드 작성을 위한 간결한 구문을 제공하여 빠른 API 개발이 가능!
  • Starletter 프레임워크 개발자가 개발하였으며 Python의 성능을 극대화하고 개발자 경험을 향상시키는 목표를 가지고 만들었다고합니다.

2. Fast API 장점

  • Starlette 프레임워크 기반 ASGI 비동기 처리로 대규모 트래픽 처리에 유리하다
  • 타입 힌트 기반의 자동 문서화한다. Pydantic을 사용하여 타입 힌트를 기반으로 자동으로 API 문서를 생성
  • OpenAPI 지원을 통한 자동 스웨거 생성
  • 직관적이고 간결한 문법으로 빠른 API 작성
  • Python 기반 라이브러리와 호환성이 높음

3. 관련 용어 정리

  • WSGI (Web Server Gateway Interface)

WSGI는 Python 웹 애플리케이션과 웹 서버 간의 표준 인터페이스를 제공한다. python 웹 프레임워크와 웹 서버가 상호 작용할 수 있도록 하는 규칙이며 여러 애플리케이션을 서로 다른 웹 서버에 배포할 수 있도록 표준화된 방법

  • ASGI (Asynchronous Server Gateway INterface)

ASGI는 WSGI의 비동기 버전으로 Python의 비동기 웹 애플리케이션을 위한 인터페이스이다. WSGI는 동기적 요청-응답 패턴에 적합하지만 ASGI는 비동기 요청-응답을 처리하며 WebSocket과 같은 실시간 통신을 처리하는데 적합하다

  • Cpython

Cpython은 Python 프로그램을 C나 C++로 코드를 변환하는 도구로 Python과 C언어 혼합 형태로 사용되며 Python 코드에 정적 타입을 추가하고 C 확자 모듈을 생성하여 Python 코드의 성능을 향상시킨다. 실행을 위해 CPython 인터프리터가 필요하다

  • uvloop

uvloop는 asyncio 이벤트 루프의 성능 향상을 위한 라이브러리로 libuv 이벤트 루프 라이브러리의 Python 바인딩을 제공하며, asyncio의 기본 이벤트 루프보다 성능이 좋다

  • coroutine

coroutine은 비동기 프로그래밍을 위한 개념으로, 실행이 일시 중지되고 다시 시작될 수 있는 함수이다. 이를 통해 비동기적인 작업을 간다하게 표현할 수 있다

  • Event loop

이벤트 루프는 비동기 프로그래밍에서 이벤트를 관리하고 처리하는 매커니즘이다. 비동기 코드에서는 이벤트 루프를 사용하여 작업 스케줄링을 관리한다

  • DI (Dependency Injection)

의존성 주입은 객체지향 프로그래밍에서 사용되는 패턴으로 객체가 필요로 하는 의존성을 외부에서 받도록 하는 것을 의미한다 이를 통해 객체간의 결합도를 낮추고 유연성을 높일 수 있다.

참고자료

  1. https://tech.madup.com/FastAPI/
  2. https://livvjh.com/posts/develop/fastapi-beginner/

'Python > FastAPI' 카테고리의 다른 글

FAST API get, post 사용방법  (1) 2024.01.29

안녕하세요 오늘은 FAST API의 get, post 사용방법에 대해 소개시켜 드리겠습니다

 

기본적인 설치 내용은 빼려고 했으나 다시 추가하기로 해서 넣어두겠습니닷

 

 

 

 

  1. FAST API 설치
pip install fastapi
pip install uvicorn

# 오늘 사용할 예정
pip install httpx
 

 

 

 

2. 기본적인 get 사용 방법

@app.get("/")
def main_re():
    return 'hello youngs'
 

실행해보면 웹페이지에 hello youngs가 출력되는 코드입니다.

 

 

 

 

3. URL 리다이렉트

@app.get("/")
def main_re():
    return RedirectResponse("http://127.0.0.1:8000/main/")
 

저는 루트 페이지가 메인이 아닐때 사용하는 URL 리다이렉트 방법입니다 들어올때는 URL이 적은게 복잡하지 않고 편리해 보이기에 사용할껄요? 다른분들은 어떻게 사용하는지 확인해 본적이 없습니닷

 

 

 

 

4. JSON 값을 리턴하기

# JSON 값을 리턴하는 API
@app.get("/items/", response_class=JSONResponse)
async def read_items():
    return {"item_id": "Foo"}
 

JSON 값을 출력하기만 하는 코드입니다

 

 

 

 

5. JSON 값을 리턴하는 함수를 통해 값 요청하기

async def call_main():
    async with httpx.AsyncClient() as client:
        response = await client.get('http://127.0.0.1:8000/items/')
        return response.json()

@app.get("/main/")
async def main_page(request: Request):
    client_host = request.client.host
    response_data = await call_main()
    return {"client_host": client_host, "response_data": response_data} #, "response_cal": response_cal}
 

client의 http 주소 출력과 4번에서 만든 items의 JSON 값을 요청받는 함수를 통해 값을 요청하는 코드입니다

간단히 get API에 JSON형식 리턴값을 요청 및 응답받아 출력하는 방식입니다

 

 

 

 

6. get URL을 통해 값 받아오기

@app.get("/items/line/{item_id}")
async def get_line(item_id: int):
    return item_id
 

조금 고전적이지만 쉽고 보안성이 보장되지 않는 방법인 get URL을 통한 값 받아오기 방법입니다

 

 

 

 

7. BaseModel로 값을 정의하고 값을 포함한 post 요청과 값에 대한 리턴을 출력하기

# 7-BaseModel : 값 정리역할
class Item(BaseModel):
    price: int
    cnt: int
    name: str

# 7-response : post test 받은 값을 리턴
@app.post("/items_test/")
async def items_test(item: Item):
    # dict_price = {"item_price": item.price, "item_cnt": item.cnt}
    return item.price * item.cnt, item.name


# 7-requestpost : test json 값과 함께 post 요청
@app.get('/ii/')
async def read_item():
    # POST 요청을 생성하여 /items_test 엔드포인트에 데이터 전송
    async with httpx.AsyncClient() as client:
        item_data = {"price": 10, "cnt": 5, "name":"youngs"}  # 원하는 데이터 설정
        try:
            response = await client.post("http://127.0.0.1:8000/items_test/", json=item_data)
            response.raise_for_status()  # HTTP 오류가 있는 경우 예외 발생
            return {"item_from_post": response.json()}
        except httpx.HTTPError as e:
            return {"error": f"HTTP error occurred: {str(e)}"}
        except Exception as e:
            return {"error": f"An error occurred: {str(e)}"}
 

BaseModel을 통해 데이터 유효성 검사를 하고 post items_test 에서 간단한 곱셈을 통해 기능을 부여한 후에 리턴하여 ii에서 받도록 하는 이제조금 API를 사용하는 형태의 구조입니다

get ii 쪽에 예외처리는 대부분 BaseModel에서 유효성 검사가 되지않는 경우를 위한 예외처리를 추가했습니다

 

 

 

오늘은 웹에서 아주 기본적으로 사용되는 get, post를 소개해보았습니다 이제 앞으로 restful을 간단히 정리해보고 필요한 API를 하나씩 구현해보면서 프로젝트를 완성해보도록 하겠습니다

 

프로젝트는 데이터 분석에서 사용한 네이버 API를 연동해서 자동화를 통한 데이터 수집 까지만 구상해서 만들어보도록 하겠습니다

데이터는 추후 어떻게 활용되는지 조금 더 생각해보고 Slack을 사용하여 알림을 주는 느낌으로 구상하고있습니다!

 

다음에는 아마 RESTFULL API 일것같습니다

 

 

 

마지막으로

 

공부에 사용한 코드 전체 올려드립니다!

import httpx
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from fastapi.responses import RedirectResponse
from pydantic import BaseModel

app = FastAPI()

# 2. 기본형
@app.get("/")
def main_re():
    return 'hello youngs'

# 3. 루트 접속 시 main 으로 리다이렉트
@app.get("/")
def main_re():
    return RedirectResponse("http://127.0.0.1:8000/main/")

# 4. JSON 값을 리턴하는 API
@app.get("/items/", response_class=JSONResponse)
async def read_items():
    return {"item_id": "Foo"}


# 5-함수 : JSON 값을 리턴하는 API 값 call 함수
async def call_main():
    async with httpx.AsyncClient() as client:
        response = await client.get('http://127.0.0.1:8000/items/')
        return response.json()

# 5-API : API Call 함수로 값 요청하기
@app.get("/main/")
async def main_page(request: Request):
    client_host = request.client.host
    response_data = await call_main()
    return {"client_host": client_host, "response_data": response_data} #, "response_cal": response_cal}

# 6. get URL
@app.get("/items/line/{item_id}")
async def get_line(item_id: int):
    return item_id

# 7-BaseModel : 값 정리역할
class Item(BaseModel):
    price: int
    cnt: int
    name: str

# 7-response : post test 받은 값을 리턴
@app.post("/items_test/")
async def items_test(item: Item):
    # dict_price = {"item_price": item.price, "item_cnt": item.cnt}
    return item.price * item.cnt, item.name


# 7-requestpost : test json 값과 함께 post 요청
@app.get('/ii/')
async def read_item():
    # POST 요청을 생성하여 /items_test 엔드포인트에 데이터 전송
    async with httpx.AsyncClient() as client:
        item_data = {"price": 10, "cnt": 5, "name":"youngs"}  # 원하는 데이터 설정
        try:
            response = await client.post("http://127.0.0.1:8000/items_test/", json=item_data)
            response.raise_for_status()  # HTTP 오류가 있는 경우 예외 발생
            return {"item_from_post": response.json()}
        except httpx.HTTPError as e:
            return {"error": f"HTTP error occurred: {str(e)}"}
        except Exception as e:
            return {"error": f"An error occurred: {str(e)}"}
 

 

'Python > FastAPI' 카테고리의 다른 글

Fast API 장단점  (0) 2024.01.29

+ Recent posts