반응형

FastAPI main 기초 예제  

 

정리. 수알치 오상문

 

FastAPI 공식 사이트 : https://fastapi.tiangolo.com

 

 

fastapi 설치

 

$ pip install fastapi

 

uvicorn 설치

 

$ pip install uvicorn

 

main.py 작성

 

from fastapi import FastAPI

app = FastAPI()

 

@app.get("/")

async def root():

return { "message" : "Hello World" }

 

fastapi + uvicorn 실행 # 기본 포트 8000

 

$ uvicorn main:app --reload --host=0.0.0.0 --port=80

 

>> app : main.py에 있는 app=FastAPI()

>> --reload : 코드 변경 시 자동 저장 재시작

>> --host : 모든 접근이 가능하려면 0.0.0.0

>> --port : 접속 포트 설정

 

서버 접속

 

- localhost:8000 

- 80번 포트는 localhost 또는 127.0.0.1 접속 

- 자동 생성 문서 확인: localhost:8000/docs  ocalhost/docs

 

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

 

from typing import Optional

from fastapi import FastAPI

# from pydantic import BaseModel

 

app = FastAPI()

@app.get("/")

async def root():

  return {"message": "API Help: .../docs"}  # http://127.0.0.1/req/5?q=somequery

 

@app.get("/req/{req_id}")

def req(req_id: int, q: Optional[str] = None):

  return {"request_id": req_id, "q": q}

 

서버 실행

 

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

 

테스트 (80번 포트 아니면 기본 :8000 사용)

 

http://127.0.0.1

http://127.0.0.1/req/5

http://127.0.0.1/req/5?q=somequery

http://127.0.0.1/docs # 테스트

http://127.0.0.1/redoc # API 문서

 

API 서버에 요청하는 파이썬 파일

 

import requests

import json

 

url = "http://localhost/req/" # 요청 url 주소

data = {"req_id": 100} # 요청 데이터

res = request.post(url, data=json.dumps(data)) # post로 API 서버에 요청

print(res.text) # return으로 req 내용을 그대로 보냈기에, 입력 데이터가 json 형태로 보여진다.

 

PUT 요청 본문(Body)을 받응 main.py

 

Pydantic을 이용해 파이썬 표준 타입으로 본문을 선언합니다.

 

from typing import Optional

from fastapi import FastAPI

from pydantic import BaseModel

 

app = FastAPI()

 

class Item(BaseModel):

  name: str

  price: float

  is_offer: Optional[bool] = None

 

@app.get("/")

def read_root():

  return {"Hello": "World"}

 

@app.get("/items/{item_id}")

def read_item(item_id: int, q: Optional[str] = None):

  return {"item_id": item_id, "q": q}

 

@app.put("/items/{item_id}")

def update_item(item_id: int, item: Item):

  return {"item_name": item.name, "item_id": item_id}

 

POST 처리하기

 

from typing import Optional

from fastapi import FastAPI

from pydantic import BaseModel

 

class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

 

app = FastAPI()

 

@app.post("/items/")

async def create_item(item: Item):

  # return item          # : string

  item_dict = item.dict()

  if item.tax:

    price_with_tax = item.price + item.tax

    item_dict.update({"price_with_tax": price_with_tax})

  return item_dict

 

JSON 호환 처리 ?

 

from datetime import datetime

from typing import Optional

from fastapi import FastAPI

from fastapi.encoders import jsonable_encoder

from pydantic import BaseModel

 

class Item(BaseModel):

  title: str

  timestamp: datetime

  description: Optional[str] = None

 

fake_db = {}   # 가짜 DB

app = FastAPI()

 

@app.put("/items/{id}")

def update_item(id: str, item: Item):

  json_compatible_item_data = jsonable_encoder(item)

  fake_db[id] = json_compatible_item_data  # 가짜 DB 업데이트 

 

<이상>

 

반응형

+ Recent posts