FastApi Planner 만들기

최준호·2024년 2월 9일

FastAPI

목록 보기
9/9
post-thumbnail

🔴 Planner 만들기 시작

🟠 신규 프로젝트 작성

🟢 model

from pydantic import BaseModel
from typing import List

class Event(BaseModel):
    id: int
    title: str
    image: str
    description: str
    tags: List[str]
    location: str

    class Config:
        json_schema_extra = {
            "example" : {
                "title": "제목",
                "image": "https://linktomyimage.com/image.png",
                "description": "설명~~~",
                "tags": ["태그1", "태그2", "태그3"],
                "location" : "kakao"
            }
        }
from pydantic import BaseModel
from typing import Optional, List
from planner.models.event import Event

class User(BaseModel):
    email: str
    password: str
    events: Optional[List[Event]]

    class Config:
        json_schema_extra= {
            "example": {
                "email" : "email@mail.com",
                "password": "password",
                "events": []
            }
        }

class UserSignIn(BaseModel):
    email: str
    password: str

    class Config:
        json_schema_extra= {
            "example": {
                "email" : "email@mail.com",
                "password": "password"
            }
        }

event와 user model을 각각 정의해둔다.

🟢 router

from fastapi import APIRouter, HTTPException, status
from planner.models.user import User, UserSignIn

user_router = APIRouter(tags=["User"])

# user 임시 저장소
users = {}

# 회원가입
@user_router.post("/signup")
async def singup(user: User) -> dict:
    # users list에 user.email이 있는지 체크
    if user.email in users:
        raise HTTPException(
            status_code=status.HTTP_409_CONFLICT,
            detail="존재하지 않는 유저입니다."
        )
    users[user.email] = user
    return {
        "message" : "회원가입 완료"
    }

# 로그인
@user_router.post("/signin")
async def signin(user: UserSignIn) -> dict:
    if user.email not in users:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="아이디 또는 비밀번호를 확인해주세요."
        )
    if users[user.email].password != user.password:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="아이디 또는 비밀번호를 확인해주세요."
        )
    
    return {
        "message" : "로그인 성공"
    }

🟢 main

from fastapi import FastAPI
from planner.routers.user import user_router

import uvicorn

app = FastAPI()
app.include_router(user_router, prefix="/user")

if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

이렇게 설정을 해주면 이전에 uvicorn을 터미널에서 실행시킬 필요 없이

python main.py

로 실행시키면 python에서 uvicorn을 통해 앱을 실행시켜준다.

👈 실행하며 발생했던 에러

바뀐 실행방법으로 실행하려니 무한로딩에 빠지는 현상이 발생했다. 분명 앱은 정상적으로 실행이 되는데 무한로딩이 걸려 구글을 뒤져보니 정말 간단한 이유였는데 이전에 실행했던 fastapi 서버가 정상적으로 종료되지 않았던 것이다.

해결 방법은 나 같은 경우 localhost:8000 으로 실행한 서버였는데 해당 서버를 터미널을 통해 강제 종료 시키면 된다.

강제 종료 방법은 os마다 다르니 구글이나 챗지피티한테 물어보는게 제일 빠르다~!

🟢 event router 정의

from fastapi import APIRouter, Body, HTTPException, status
from planner.models.event import Event
from typing import List

event_router = APIRouter(tags=["Events"])

events = []

@event_router.get("/", response_model=List[Event])
async def getAll() -> List[Event]:
    return events

@event_router.get("/{id}", response_model=Event)
async def get(id: int) -> Event:
    for event in events:
        if event.id == id:
            return event
    raise HTTPException(
        status_code=status.HTTP_400_BAD_REQUEST,
        detail="id가 유효하지 않습니다."
    )

@event_router.post("/")
async def post(body: Event = Body(...)) -> dict:
    events.append(body)
    return {
        "message" : "등록 성공"
    }

@event_router.delete("/")
async def delete() -> dict:
    events.clear()
    return {
        "message" : "삭제 성공"
    }

@event_router.delete("/{id}")
async def deleteId(id: int) -> dict:
    for event in events:
        if event.id == id:
            events.remove(event)
            return {
                "message" : "삭제 성공"
            }
    raise HTTPException(
        status_code=status.HTTP_400_BAD_REQUEST,
        detail="id가 유효하지 않습니다."
    )

🟢 router 추가

from fastapi import FastAPI
from planner.routers.user import user_router
from planner.routers.event import event_router
import uvicorn

app = FastAPI()
app.include_router(user_router, prefix="/user")
app.include_router(event_router, prefix="/event")

if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

0개의 댓글