플래너에는 플래너를 사용하는 유저정보와 플래너에 들어가는 이벤트로 구성되어 있습니다.
planner/
main.py
database/
__init__.py
connection.py
routes/
__init__.py
events.py
users.py
modlels/
__init__.py
events.py
users.py
먼저 유저 모델과 이벤트 모델을 만들어 구성해보겠습니다.
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"
}
}
플래너의 이벤트는 제목, 이미지, 설명, 태그, 그리고 위치를 추가할수 있습니다.
그다음 어플리케이션에서 사용할 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.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를 실행시키도록 관리해줍니다.
$ uvicorn main:app --reload --host 0.0.0.0 --port 8000
다음 127.0.0.1:8000/docs/ 로 접속하여 swagger로 구현된 UI를 통해 활성화된 api를 확인합니다.
