라우트는 HTTP 요청 메서드의 요청을 수락하고 선택적으로 인수를 받을 수 있도록 정의됨
요청이 특정 라우트로 전달되면 애플리케이션은 라우트 처리기(Route handler)가 요청을 처리하기 전에 해당 라우트가 정의되어 있는지 확인함
Route handler는 서버로 전송된 요청을 처리하는 함수로, Route handler의 예로는 요청을 받아 DB에서 특정 데이터를 추출하는 함수가 있음
HTTP 요청 메서드
HTTP 메서드 처리 유형을 정의하는 식별자로, 표준 메서드에는 GET, POST, PUT, PATCH, DELETE 등이 있음
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def welcom() -> dict:
return {
"message":"Hello World"
}
APIRouter 클래스는 다중 라우팅을 위한 경로 처리 클래스로 애플리케이션 라우팅과 로직을 독립적으로 구성하고 모듈화 할 수 있음
from fastapi import APIRouter
router = APIRouter()
@router.get("/hello")
async def say_hello() -> dict:
return {
"message":"Hello!"
}
CORS 이슈: 클라이언트(리액트 앱)와 서버(FastAPI)가 다른 포트에서 실행되고 있을 경우, CORS(Cross-Origin Resource Sharing) 정책 때문에 문제가 발생할 수 있습니다. 서버에서 CORS를 허용하도록 설정해야 합니다. FastAPI에서는 fastapi.middleware.cors.CORSMiddleware를 사용하여 CORS를 설정할 수 있습니다. 다음은 CORS 설정 예시입니다:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # 리액트 앱의 URL
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def read_root():
return {"Hello": "World"}
새로운 파일 생성
touch todo.py
다음은 APIRouter를 활용한 예시 코드이다.
from fastapi import APIRouter
todo_router = APIRouter()
todo_list = []
@todo_router.post("/todo")
async def add_todo(todo: dict) -> dict:
todo_list.append(todo)
return {
"message":"Todo added successfully!"
}
@todo_router.get("/todo")
async def retreive_todos() -> dict:
return {
"todos":todo_list
}
APIRouter는 FastAPI 클래스와 동일한 방식으로 작동하지만, 정의한 라우트를 FastAPI() 인스턴스에 추가해야 외부에서 접근 가능하다.
main.py 파일에 다음과 같이 todo.py 파일에서 생성한 todo_router를 import하고
FastAPI() 인스턴스의 include_router() 메서드를 사용해야한다.
from fastapi import FastAPI
from todo import todo_router
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # 리액트 앱의 URL
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def read_root():
return {"Hello": "World"}
app.include_router(todo_router)
결과를 한번 볼까? (난 React로 심플하게 확인할 수 있는 코드를 짰다)
이제 POST 요청을 전달해서 todo_list에 추가해보자
curl -X 'POST' \
'http://127.0.0.1:8000/todo' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"id":1,
"item":"First Todo is to finish this book!"
}'
그럼
{"message":"Todo added successfully!"}%
라는 메시지가 출력될꺼다.
프론트엔드에서 확인해보니,
잘 적용된거 같다.