[fastAPI] 간단 fastAPI 구축기

허상범·2024년 2월 14일
0

fastAPI

목록 보기
1/2

What is uvicorn ?

uvicorn과 함께 쓰는 FastAPI

Uvicorn은 ASGI(Asynchronous Server Gateway Interface) 서버이다. 비동기 처리를 지원하여, 높은 성능을 발휘할 수 있다. 다양한 웹 프레임워크와 함께 사용할 수 있다. FastAPI는 ASGI 서버인 Uvicorn 과 Starlette 프레임워크를 기반으로 더 많은 기능을 제공하도록 개발 되었다.

FastAPI와 Uvicorn의 장점

FastAPI와 Uvicorn은 비동기 처리를 지원하여, 기존의 멀티스레드 방식보다 더욱 빠른 처리 속도를 보장한다. Swagger와 같은 API 문서 자동화 기능을 제공하여, API 개발 시 생산성을 높일 수 있다. Pydantic과 함께 사용하여 데이터 유효성 검사를 할 수 있어, 보다 안정적인 API를 개발할 수 있다. FastAPI와 Uvicorn을 함께 사용하면, 빠르고 안정적인 웹 애플리케이션을 개발할 수 있다.

ASGI 서버인 Uvicorn의 비동기 처리와 FastAPI의 빠른 속도와 현대적인 기능을 활용하여, 멀티스레드 방식의 기존 웹 애플리케이션보다 더욱 빠르고 안정적인 애플리케이션을 개발할 수 있다.


ML 서비스 만들때 필요한 API를 fastAPI로 만들어보는게 목적이었기 때문에 아래 3가지 소스를 참고함

예시) 기본적인 ML 백엔드 프로젝트 구조 with fastAPI

  • 프로젝트의 코드가 들어갈 모듈 설정(app). 대안 : 프로젝트 이름, src 등

  • main.py는 간단하게 애플리케이션을 실행할 수 있는 Entrypoint 역할

  • main.py (또는 app.py) : FastAPI의 애플리케이션과 Router 설정

  • model.py는 ML model에 대한 클래스와 함수 정의

  • 추가 참고 Link : FastAPI로 딥러닝 모델 API 구축하기 | 문자열 파일경로, Bytes 타입 입력받기

실행을 위한 main.py 작성

# main.py 

from fastapi import FastAPI

app = FastAPI()

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

main.py 실행 (pycharm에서 실행함)

uvicorn main:app --reload --host=0.0.0.0 --port=8000

main : 여기서 main은 main.py의 main을 말한다
app : main.py안에 있는 app=FastAPI()
--reload : 코드 변경 시 자동으로 저장되어 재시작 됨
--host : 모든 접근이 가능하게 하려면 0.0.0.0을 입력한다
--port : 접속 원하는 포트를 지정해준다.

실행결과


request 테스트를 위한 main.py 재작성

  • 테스트를 위한 main.py 재 작성
  • 데이터를 정의하기 위한 class작성.
    - 왜 여기에서는 self를 안쓰지 ?
  • 이때 pydantic으로 데이터의 타입까지 다 정함.
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    
app = FastAPI()

@app.post('/items/')
async def create_item(item: Item):
    return item

jupyter notebook에서 한 줄씩 실행

# jupyter notebook 에서 한 줄 씩 실행
# 1. 필요한 라이브러리 임포트
import requests
import json

# 2. 요청 보낼 url 주소
url = "http://localhost:8000/items/"

# 3. 같이 보낼 데이터 작성
data = {"name": "new_challenge", 
        "description":"test1", 
        "price":2020, 
        "tax":2021}
        
# 4. post로 API서버에 요청보내기
res = requests.post(url, data=json.dumps(data))

# 5. 결과 확인하기
res.text

pycharm 실행화면

post만 개발해서, get 메소드는 메소드 에러가 나고있는 것으로 보임 ??


Question

API 코드는 Pycharm에서 작성했는데, 왜 juptyer에서 해당 API를 사용하는게 가능한거지 ?

profile
Engineering & Science, Since 2021 | Finance, Backend, Data

0개의 댓글