from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello":"World"}
Fast API를 통해 백엔드 실행 : uvicorn streamlit_example:app
app=FastAPI()를 통해 FastAPI 객체를 만들었으므로 app을 입력한 것이다. 이렇듯 Fast API를 활용하는 백엔드를 개발하기 위해서는 FastAPI 객체를 활용한다는 것을 명령어에도 포함시켜야 한다.http://127.0.0.1:8000/ 으로 가면 내가 원하는 웹 메인 페이지로 접속할 수 있다

uvicorn ~:app을 수행하기엔 귀찮을 수 있다. 이럴 때 python으로 수행시키고 싶을 수도 있는데, 여기에도 방법이 존재한다from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello":"World"}
if __name__=='__main__':
uvicorn.run(app, host='0.0.0.0', port = 8000)
python streamlit_example.pyuvicorn.run에서 알아서 처리해줌(인자로 전달해줌)

from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/users/{user_id}")
def read_root(user_id):
return {"Hello":user_id}
if __name__=='__main__':
uvicorn.run(app, host='0.0.0.0', port = 8000)

from fastapi import FastAPI
import uvicorn
app = FastAPI()
fake_db = ['A','B','C','D']
@app.get("/items")
def read_root(start:int=0,end:int=5):
return fake_db[start:end]
if __name__=='__main__':
uvicorn.run(app, host='0.0.0.0', port = 8000)

start:int=0으로써 start는 0으로, end는 5로 설정되어 결과를 반환from typing import Optional로써 import 가능from fastapi import FastAPI
from typing import Optional
import uvicorn
app = FastAPI()
fake_db = ['A','B','C','D']
@app.get("/items")
def read_root(start:int=0,end:int=5, skip:Optional[int]=None):
if not skip:
return fake_db[start:end]
return fake_db[start:skip] + fake_db[skip+1:end]
if __name__=='__main__':
uvicorn.run(app, host='0.0.0.0', port = 8000)

GET은 URI에 정보를 담아 Request를 보냈지만, POST 방식은 Packet(Request Body)에 정보를 담아 Request를 보내야 함
pydantic을 활용하여 Request Body 데이터 정의
from pydanti import BaseModel을 통해 BaseModel 모듈을 가져오고, BaseModel 모듈을 상속받는 클래스를 생성하여 Request Body 형성 가능
from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel
import uvicorn
app = FastAPI()
# Request Body를 통해 받을 데이터들
class Item_in(BaseModel):
name: str
description: Optional[str] = None
sex: str
age: int
@app.post("/items")
def create(item:Item_in):
return item
if __name__=='__main__':
uvicorn.run(app, host='0.0.0.0', port = 8000)

어라, 왜 수행이 안되지?
...라고 생각했다면 POST와 GET을 잘 이해하지 못한것!
위에서 짠 코드는 "POST" 방식의 통신이다.
즉, 데이터를 Packet의 Body에 담아 /items에 접속해야하는데, 이런 과정 없이 GET 방식으로 접근하려니 에러가 발생하는 것이다.
그렇다면 이럴 경우 어떻게 실험할 수 있을까?
원래는 Postman을 활용하면 되지만, 우리에겐 더 쉬운 방법이 있다.
앞에서 말했듯, Fast API의 장점, Swagger!


Request로 데이터가 왔을 때, 대부분의 경우 Respond로 내보내고 싶은 데이터의 형식은 Request 데이터 형식과 다르다.
하지만, @app.post()를 활용하면 Request Body와 동일한 형식의 데이터만 내보낼 수 있게 된다.
즉, "Request Body"와 다른 형태의 데이터 형식을 Respond로 보내고 싶을 때 활용하는 것이 Response Body이다.
response_model Parameter 활용from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
app = FastAPI()
# Request Body
class ItemIn(BaseModel):
name:str
description:str
sex:str
# Response Body
class ItemOut(BaseModel):
name: str
sex: str
# 핵심 구현!!!
@app.post("/items/{item_id}", response_model=ItemOut)
def read_item(inputs: ItemIn):
item = {'name':inputs.name, 'sex':inputs.sex}
return item
if __name__=='__main__':
uvicorn.run(app, host='0.0.0.0', port = 8000)
@app.post부분을 보면response_model=ItemOut을 통해 어떤 객체가 Response Body로써 나갈 것인지 명시해주었다. Request Body는 원래 방식과 동일하다
여기서 중요한 점은 item의 형식이다.
원래 Postman이나 Swagger를 통해 Request를 보낼 때 {"값":"쌍"} 형식(JSON 형식)으로 데이터를 보냄을 알 수 있다.
Respond를 보낼때도 마찬가지이다. JSON 형식으로 Response Body의 Key 값들에 접근하고, Value를 넣어주는 형식으로 데이터를 만들어 이렇게 만든 데이터를 Response Body로 반환해야 한다
- 참고로 Request Body에서 접근할 때는 '.'을 통해 Key String을 연결하면 Key에 대응되는 Value 값을 얻어올 수 있다