관리 메뉴

진취적 삶

5 구조화 본문

개발 도서/FastAPI

5 구조화

hp0724 2023. 10. 10. 14:01

애플리케이션 구조와 기능이 복잡해지면 애플리케이션을 적절하게 구조화 해야한다.

  • 애플리케이션 라우트와 모델 구조화
  • 플래너 API용 모델 구현

5.1 FastAPI 애플리케이션 구조화

  • routes 폴더
    • events.py : 이벤트 생성 ,변경 ,삭제 등의 처리를 위한 라우팅
    • users.py : 사용자 등록 및 로그인 처리를 위한 라우팅
  • model 폴더
    • events.py : 이벤트 처리용 모델을 정의
    • user.py : 사용자 처리용 모델을 정의

이벤트 플래너 애플리케이션 개발

등록된 사용자는 이벤트를 추가 ,변경삭제

가상환경 설정

python3 -m venv venv 
(venv) C:\\FastAPI-BOOK\\planner>pip install fastapi uvicorn "pydantic[email]"

requirement 로 저장

(venv) C:\\FastAPI-BOOK\\planner>pip install fastapi uvicorn "pydantic[email]"

모델 구현

애플리케이션 첫 단계는 이벤트 모델과 사용자 모델을 정의하는것

라우트 구현

사용자 라우트는 로그인 ,로그아웃,등록으로 구성

사용자 /user 이벤트 /event

/signup 생성 /new
/signin 조회 / , /{id}
/signout 변경 /{id}
  삭제 /{id}

models/userpy

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]]

    class Config:
        json_schema_extra = {
            "example": {
                "email": "fastapi@packt.com",
                "password": "strong!!!",
                "events": [],
            }
        }

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

    class config:
        json_schema_extra = {
            "example": {
                "email": "fastapi@packt.com",
                "password": "strong!!!",
                "events": [],
            }
        }

routes/user.py

from fastapi import APIRouter, HTTPException, status
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="User with supplied email exists"
        )
    users[data.email] = data 
    return {
        "message": "User successfully registered"
    }

@user_router.post("/signin")
async def sign_user_in(user: UserSignIn) -> dict:
    if user.email not in users:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="User does not exist"
        )
    
    # Get the stored user object
    stored_user = users[user.email]

    if stored_user.password != user.password:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Wrong credentials passed"
        )

    return {
        "message": "User signed in successfully"
    }

'개발 도서 > FastAPI' 카테고리의 다른 글

7 보안  (1) 2023.10.10
6 데이터베이스 연결  (0) 2023.10.10
4 템플릿팅  (0) 2023.10.10
3 응답 모델과 오류 처리  (1) 2023.10.10
2 라우팅  (0) 2023.10.10