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을 각각 정의해둔다.
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" : "로그인 성공"
}
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마다 다르니 구글이나 챗지피티한테 물어보는게 제일 빠르다~!
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가 유효하지 않습니다."
)
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)