FastAPI(2) -Planner with fastapi

dohun p·2024년 7월 24일

FastAPI

목록 보기
2/2
post-thumbnail

Planner with fastapi

파일 구성

플래너에는 플래너를 사용하는 유저정보와 플래너에 들어가는 이벤트로 구성되어 있습니다.

planner/
	main.py
	database/
		__init__.py
		connection.py
	routes/
		__init__.py
		events.py
		users.py
	modlels/
		__init__.py
		events.py
		users.py

먼저 유저 모델과 이벤트 모델을 만들어 구성해보겠습니다.

MODEL

models/users.py

from pydantic import BaseModel, EmailStr
from typing import Optional, List
from models.events import Event

class User(BaseModel):
    email: EmailStr #사용자 이메일
    password:str # 사용자 패스워드
    events: Optional[List[Event]] #사용자가 생성한 이벤트 import Event를 이용해 상속받음
    class Config: #config를 통해 예시하나를 제공하고 있습니다.
        schema_extra = {
            "example": {
                "email": "pdh@pdh.com",
                "password": "might008",
                "events": []
            }
        }

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

    class Config:
        schema_extra = {
            "example": {
                "email": "pdh@pdh.com",
                "password": "might008"
            }
        }

User 는 이메일과 비밀번호를 가지고있고, 리스트형태로 이벤트를 저장합니다.

UserSign은 로그인 기능을 부여하기 위해 만들어주었습니다.

models/event.py

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:
        schema_extra = {
            "example": {
                "title": "Fastapi book launcjh",
                "image": "https://linktomyimage.com/image.png",
                "description": "we will be discussing the contents of the FastAPI book in this event.",
                "tags": ["python", "fastapi", "book", "launch"],
                "location": "Google Meet"
            }
        }

플래너의 이벤트는 제목, 이미지, 설명, 태그, 그리고 위치를 추가할수 있습니다.

ROUTE

그다음 어플리케이션에서 사용할 API들을 생성해줍니다. 코드관리의 편의성을 위해 router를 이용해 관리 해주었습니다.

routes/users.py

from fastapi import APIRouter, status, HTTPException
from models.users import User, UserSignIn

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

users = {}

@user_router.post("/signup")
async def sign_new_user(data:User) -> dict:
    if data.email in users:
        raise HTTPException(
            status_code=status.HTTP_409_CONFLICT,
            detail="Email already registered"
        )
    users[data.email] = data
    return {
        "message": "User registered"
    }

@user_router.post("/signin")
async def sign_new_user(data:UserSignIn) -> dict:
    if User.email not in users:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="User does not exist"
        )
    if users[User.email].password != User.password:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Password does not match"
        )
    return "User signed in successfully"

/signup으로 접속하게 되면 회원가입(signup)을 진행하게 됩니다.

/signin으로 접속하게되면 로그인정보를 입력하고 로그인을 하게 됩니다.

routes/events.py

from fastapi import APIRouter, Body, Response, status, HTTPException
from models.events import Event
from typing import List

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

events=[]

@events_router.get("/",response_model=List[Event]) #pydantic 모델로 엔드포인트가 반환하는 응답의 대이터 모델을 지정합니다..
async def retrieve_all_events() -> List[Event]:
    return events

@events_router.get("/{id}",response_model=Event)
async def retrieve_event(id: int) -> Event: #비동기 함수 이름 정의 ->event는 이함수가 반환하는 객체의 타입을 의미합니다.
    for event in events:
        if event.id ==id:
            return event
    raise HTTPException(status_code=404, detail="Event not found")

@events_router.post("/new")
async def create_event(body: Event = Body(...))-> dict: 
#body: Event = Body(...)는 요청 본문이 Event 모델 형식이어야 하며, FastAPI의 Body 함수를 사용하여 본문을 파싱함을 나타냅니다.
    events.append(body)
    return {
        "message": "Event created"
    }
@events_router.delete("/{id}")
async def delete_event(id: int)-> dict:
    for event in events:
        if event.id ==id:
            events.remove(event)
            return {"message": "Event deleted"}

‘GET’ : 데이터베이스에 저장된 데이터를 가져옵니다

‘POST’: 새로운 이벤트를 데이터베이스에 저장합니다.

‘DELETE’: 이벤트를 데이터베이스에서 제거합니다.

MAIN

main.py

from fastapi import FastAPI
from routes.users import user_router
from routes.events import events_router
import uvicorn

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

if __name__ == "__main__":
    main()

메인함수에서 router를 통해 api를 실행시키도록 관리해줍니다.

Test

서버실행

$ uvicorn main:app --reload --host 0.0.0.0 --port 8000

다음 127.0.0.1:8000/docs/ 로 접속하여 swagger로 구현된 UI를 통해 활성화된 api를 확인합니다.

0개의 댓글