1. 스키마 작성

유저 가입 기능을 구현하기 이전에 데이터 검증모델을 pydantic을 이용해서 스키마 작성을 한다.

 

파일들이 여러개로 늘어나는 문제로 폴더명를 조금 변경하고 파일을 이동시켰다.

 

몇가지 파일을 밑에서 생성할 파일들이다.

 

hexagonMan(루트폴더)

     ---db---database.py, db_user_crud.py, models.py

    db폴더. 데이터베이스 관련 파일

     ---migrations---

    alembic 관련 폴더

    ---routers--- schemas.py, user.py

    라우터 폴더. API관련 실행이 담겨있는 파일들이다.

- main.py

- haxagonMan.db

- alembic.ini

- requirements.txt

 

# routers 폴더 - schemas.py
from pydantic import BaseModel
from datetime import datetime

class UserBase(BaseModel):
   username: str
   password: str

# todo 암호관련 작업 필요하다.

class UserDisplay(BaseModel):
   username: str
   class Config():
       from_attributes = True

class PostBase(BaseModel):
   age: str
   height: str
   education: str
   occupation: str
   residence_location: str
   religion: str
   timestamp: datetime

class CommentBase(BaseModel):
   text: str
   username: str
   timestamp: datetime

routers 폴더에 schemas 파일을 생성하고 코드를 작성하였다.

 

db - models 의 Colunms를 참고하여 작성하였다.

 

암호 관련 작업은 빠져있다.

 

orm_mode 가 from_attribute 로 리네임 됐다는 알람을 띄우기 때문에 변경하였다.

 

스키마는 프론트엔드와 백엔드 사이에서 주고 받을 데이터를 검증하는 거름망이다. 

#routers 폴더 - user.py
from sqlalchemy.orm.session import Session
from routers.schemas import UserBase, UserDisplay
from fastapi import APIRouter, Depends
from db.database import get_db
from db import db_user_crud

router = APIRouter(
   prefix='/user',
   tags=['user']
)

@router.post('', response_model=UserDisplay)
def create_user(request:UserBase, db:Session=Depends(get_db)):
   return db_user_crud.create_user(db, request)

 

프론트엔드에서 요청이 오면 API에서 받아서 데이터베이스에 명령을 하고 그 수행 결과를 다시 반환하는 코드이다. 코드를 살펴보면

router = APIRouter(
   prefix='/user',
   tags=['user']
)

prefix가 없다면 아래와 같다.

@router.post('/user')

여러개의 기능을 작성할때마다 매번 작성해야 되는 부분을 prefix로 줄일수 있다. 

response_model=UserDisplay

사용자가 가입하고 난 다음에 비밀번호와 같이 민감한 정보 다시 반환하지 말고 스키마에 UserDisplay로 정의한 내용한 보낸다. 여기서는 유저네임만 해당한다.

def create_user(request:UserBase, db:Session=Depends(get_db)):

의존성 주입을 통해서 매번 데이터베이스를 열고 실행, 닫는 코드를 반복 작성하지 않고. 

db:Session=Depends(get_db)

이 코드로 해결한다.

# db-db_user_crud.py
from routers.schemas import UserBase
from sqlalchemy.orm.session import Session
from db.models import DbUser

def create_user(db:Session, request: UserBase):
    new_user = DbUser(
        username = request.username,
        password = request.password
    )
    db.add(new_user)
    db.commit()
    db.refresh(new_user)
    return new_user

API로부터 받은 데이터를 데이터 베이스가 직접 추가하고 실행, 새로고침 하는 코드이다. 

 

이제 시범을 해볼 차례이다. code 응답이 200이면 성공이다. response body를 살펴보면 비밀번호는 제외하고 유저네임만 반환되는 것을 확인할수 있다.

+ Recent posts