진취적 삶
5 구조화 본문
애플리케이션 구조와 기능이 복잡해지면 애플리케이션을 적절하게 구조화 해야한다.
- 애플리케이션 라우트와 모델 구조화
- 플래너 API용 모델 구현
5.1 FastAPI 애플리케이션 구조화
- routes 폴더
- model 폴더
이벤트 플래너 애플리케이션 개발
등록된 사용자는 이벤트를 추가 ,변경삭제
가상환경 설정
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 |