본문 바로가기
Study notes

FastAPI 기초부터 A to Z

by AI미남홀란드 2024. 7. 10.
728x90

기본적인 웹서비스 구조

 

유저 -> 클라이언트 -> 서버 <- 데이터베이스 , 서버 <- 개발자 로 구성이 되어있다.

 

Fast API 

FastAPI 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python API 빌드하기 위한 프레임워크입니다.

-> GPT API를 사용하는것처럼 결과를 리스폰해줄 수 있게끔 가능함

 

FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

 

pip install fastapi


pip install "uvicorn[standard]"

 

먼저 설치를 해준다.

 

from fastapi import FastAPI 

app = FastAPI()

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

 

데코레이터 read_root 를 사용하면 다른 코드들까지 수행한다. (데코레이터는 외곽에 다른 기능을 수행)

 

#
---------
app.get # Create
app.post # Read
app.put # Update
app.delete # Delete
---------
#

웹에는 Create, Read, Update, Delete CRUD 개념이 존재함

 

Path Parameter

 

from fastapi import FastAPI 

app = FastAPI()

#path parameter
items = {
    0: {"name": "kdb",
        "price": 500},
    1: {"name": "ronaldo",
        "price": 1000},
    2: {"name": "messi",
        "price": 8000}
}

@app.get("/{item_id}")
def read_root(item_id: int):
    return items[item_id]

 

주소 / 뒤에 0,1,2 가 들어갔을때 메시 호날두, 김덕배의 정보들이 나오게된다.

 

다음 코드는 key 를 적용해서 리턴값을 받아오는 걸 적용해보면..

주소/0/[key] = name,price 를 입력할때 값을 받아오는 것을 알 수 있다.

from fastapi import FastAPI 

app = FastAPI()

#path parameter
items = {
    0: {"name": "kdb",
        "price": 500},
    1: {"name": "ronaldo",
        "price": 1000},
    2: {"name": "messi",
        "price": 8000}
}

@app.get("/{item_id}/{key}")
def read_root(item_id: int, key: str):
    return items[item_id][key]

 

위처럼 get 을 통해서 자료를 가져오는 걸 적용해볼 수 있다.

 

Query Parameter

@app.get("/kdb-name-search")

def read_name_search(name: str):
    for item_id, item in items.items():
        if item["name"] == name:
            return item
    return {"error": "Not Found"}

반복문을 돌면서, item_id, item 내부의 item 을 가져오는 코드

 

http://127.0.0.1:8000/kdb-name-search?name=ronaldo

-> 위처럼 ? 쿼리를 적어주어야한다. name=이 ronaldo 인 item 을 가져온다.

 


Post

데이터를 가져올때 규약을 정해주는 라이브러리

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    
    
 # body 영역에서 정보를 제공할 때 사용
@app.post("/items/{item_id}")
def create_item(item_id: int, item: Item):
    items[item_id] = item.dict()
    return{"success": "Item created successfully"}

/docs 를 치면 정보들이 다 나와있다.

 

Put

docs에서 가격을 입력하면 바뀌는 코드

class ItemForUpdate(BaseModel):
    name: Optional[str]
    price: Optional[float]

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    if item_id not in items:
        return{"error": "Item does not exist"}
    if item.name:
        items[item_id]["name"] = item.name
    if item.price:
        items[item_id]["price"] = item.price

Delete

item안의 item_id 를 POP(제거) 하는 코드

@app.delete("/items/{item_id}")
def delete_item(item_id: int):
    items.pop(item_id)
    return{"success": "Item deleted successfully"}



이제 하나의 LLM 서비스를 만들기 위해 서버 인스턴스와, 웹서버와의 유기작용을 위한 코드를 짜보면 될 듯 하다.

728x90

'Study notes' 카테고리의 다른 글

Docker Container 이해하기 - (2)  (0) 2024.07.11
Docker Container 이해하기  (0) 2024.07.11
Docker에 대하여 - (2)  (0) 2024.06.13
Docker에 대하여 - (1)  (0) 2024.06.13
Vector DB의 Querying 검색방법(keyword, semantic, hybrid)  (3) 2024.05.08