728x90

[관리자 페이지] Admin Page - 회원가입 구현하기 #3 Insert User Data


현재 user가 id와 password만 api에 제공하면 데이터가 insert 되야 합니다.

이 과정을 진행 하기 위해서는 sqlAlchemy에서 session을 얻어와 FastAPI DI를 이용해 실행되는 api method에 주입시켜 줘야합니다.

먼저 session을 얻어오는 함수를 core.py에 작성해 줍니다.

# database/core.py
from typing import Generator

from sqlalchemy import URL, create_engine
from sqlalchemy.orm import sessionmaker, Session

url = URL.create(drivername="mariadb+mariadbconnector", username="hiio420", password="...", host="...",
                 port="...", database="HIIO_ADMIN")

engine = create_engine(url)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

def get_db() -> Generator[Session, None, None]:
    with SessionLocal() as session:
        yield session

sessionmaker를 통해 SessionLocal을 정의하고 get_db 함수를 만들어 with 과 yield 를 이용해 session을 이용합니다.

https://docs.python.org/ko/dev/reference/expressions.html#yield-expressions

이제 signup과 signin 함수에 di를 하기 위해 파라미터 값으로 Depends를 이용해 넘겨 줍니다.

# api/api_main.py
from typing import Optional

from fastapi import APIRouter, Depends
from sqlalchemy import insert
from sqlalchemy.orm import Session

from api.models import UserModel
from database import get_db, User

api_main = APIRouter()


@api_main.post("/signin")
def signin(user:UserModel,session:Session = Depends(get_db)):
    return {"accessToken": "accessToken", "refreshToken": "refreshToken"}


@api_main.post("/signup")
def signup(user:UserModel,session:Session = Depends(get_db)):
    return {"message": "success"}

db에 user 정보를 저장하는 service 를 하나 만들어 줍니다.

.
┣━api
┣━database
┣━service
┃  ┣━__init__.py
┃  ┣━user.py

root 디렉토리에 service directory를 만들고 그안이 init 파일과 user 파일을 만들어 줍니다.

UserService class를 만들어 주는데 생성자로 db Genertor 객체를 받는(get_db)서비스를 만들어 주고
method로 insert_user를 정의해 줍니다.

# service/user.py
from typing import Generator

from sqlalchemy import insert
from sqlalchemy.orm import Session

from api.models import UserModel
from database import User


class UserService:

    def __init__(self, db: Generator[Session, None, None]):
        self.i = 0
        self.db = next(db)

    def insert_user(self, user: UserModel) -> bool:
        try:
            self.db.add(User(**user.dict()))
            self.db.commit()
            return True
        except Exception as e:
            self.db.rollback()
            return False

이제 __init__.py 에 UserService를 초기화 하여 userService 변수에 할당하고 all을 이용해서 다른 파일에서도 사용할 수 있게끔 해줍니다.

# service/__init__.py
from database import get_db
from .user import UserService

userService = UserService(get_db())

__all__ = ['userService']

api_main.py 파일의 signup 함수에 userSerivce의 insert_user를 호출합니다.

# api/api_main.py

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

from api.models import UserModel
from database import get_db
from service import userService
api_main = APIRouter()


@api_main.post("/signin")
def signin(user: UserModel, session: Session = Depends(get_db)):
    return {"accessToken": "accessToken", "refreshToken": "refreshToken"}


@api_main.post("/signup")
def signup(user: UserModel):
    status = userService.insert_user(user)
    return {"message": f"Insert {status}"}

서버를 실행하고 docs 다시 접속 해봅니다.

 

데이터가 잘 된것을 볼 수 있습니다.

 

728x90
728x90

[관리자 페이지] Admin Page - 회원가입 구현하기 #2 API Router

[관리자 페이지] Admin Page - 회원가입 구현하기 #1 User Table 생성

Fast API는 include_router 를 통해서 api router 를 등록하여 prefix, global DI 등을 사용할 수 있습니다.

pip install fastapi

fastapi를 설치해 주고

root 디렉토리의 main.py 의 코드를 아래와 같이 수정합니다.

# main.py
from fastapi import FastAPI

app = FastAPI()

CLI 또는 IDE Run 으로 실행하고 localhost:4883/docs 로 접속해보면

화면을 만날 수 있습니다.

1. API 목록


현재 필요한 api 목록은 최소 2개입니다.

api 디렉토리를 만들어 주고 api_main 이라는 파일을 만들어 router를 정의해 줍니다.

.
┣━api
┃  ┣━__init__.py
┃  ┣━api_main.py
┣━database
# api/api_main.py
from typing import Optional

from fastapi import APIRouter

api_main = APIRouter()


@api_main.post("/signin")
def signin(userId: Optional[str], userPw: Optional[str]):
    return {"accessToken": "accessToken", "refreshToken": "refreshToken"}


@api_main.post("signup")
def signup(userId: Optional[str], userPw: Optional[str]):
    return {"message": "success"}

main.py 에는 api_main을 import 시키고 router를 include 합니다.

# main.py
from fastapi import FastAPI

from api import api_main

app = FastAPI(title="hiioAdminServer")

app.include_router(api_main)

다시 localhost:4883/docs 에 접속합니다.

API 가 생긴걸 볼 수 있습니다.

3. Post Method Request Model

pydentic 패키지를 이용해 Request로 들어오는 파라미터를 정의해서 사용해 줍니다.

.
┣━api
┃  ┣━models
┃  ┃ ┣━__init__.py
┃  ┃ ┣━user.py
┃  ┃
┃  ┣━__init__.py
┃  ┣━api_main.py
┣━database

api 디렉토리 안에 user 파일을 만들고

pydentic 의 BaseModel을 상속받는 UserModel class를 만들어 줍니다. 속성은 database에 정의된 id, password로 동일하게 만들어 줍니다.

# api/models/user.py
from typing import Optional

from pydantic import BaseModel, Field


class UserModel(BaseModel):
    id: Optional[str] = Field(None, description="user's id")
    password: Optional[str] = Field(None, description="user's password")

    class Config:
        from_attritues = True

class Config:
from_attributes 를 사용하면 기존의 orm_mode=True를 대체해서 사용할 수 있습니다.

아까 작성했던 signin 과 signup 함수의 파라미터를 user:User로 변경해 줍니다.


# api/api_main.py
from typing import Optional

from fastapi import APIRouter

from api.models import User

api_main = APIRouter()


@api_main.post("/signin")
def signin(user:UserModel):
    return {"accessToken": "accessToken", "refreshToken": "refreshToken"}


@api_main.post("signup")
def signup(user:UserModel):
    return {"message": "success"}

변경 된 Request body로 나오는 것을 볼 수 있습니다.

 

 

728x90
728x90

[관리자 페이지] Admin Page - 회원가입 구현하기 #1


아주 간단한 회원 가입을 위해 먼저 DB -> Server -> Front 순으로 구현해봅니다.

DB 는 MariaDB 11

Server는 FastAPI

Front는 NextJS

를 사용합니다.

Python ORM 라이브러리인 sqlAlchemy 로 데이터를 조회/등록/수정/삭제합니다.

1. User Table 만들기


회원 정보는 USER_ID 와 PASSWORD 만을 가지고 있습니다.

MariaDB에 어드민 페이지를 위한 데이터베이스와 User를 만들고 권한을 부여합니다.

프로젝트 이름은 HIIO_ADMIN 으로 정했습니다.(지금)

DB NAME 은 HIIO_ADMIN
USER 는 hiio420으로 생성합니다.


CREATE DATABASE HIIO_ADMIN;
CREATE USER 'hiio420'@'%' INDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON HIIO_ADMIN.* TO 'hiio420'@'%' IDENTIFIED BY '<password>';

sql 쿼리로 테이블을 만들수도 있지만
sqlAlchemy를 이용해 봅니다.

디렉토리 구조는 아래와 같습니다.

.
┣━database

┃  ┣━entity
┃     ┣━__init__.py
┃     ┣━base.py
┃     ┣━user.py
┃  ┣━__init__.py
┃  ┣━core.py
┃
┣━README.md
┣━.gitignore

pip 로 mariadb와 sqlAlchemy를 설치합니다.

pip install mariadb
pip install sqlAlchemy

mariadb는 DB 연결에 쓰입니다.

core.py에 DB 연결을 위한 URL을 생성하고 create_engine method로 engine을 만들어 줍니다.

entity 디렉토리에는 DB entity 관련 class 들을 위치 시킵니다.base.py 에는 DeclarativeBase 상속받는 Base class를 만들고 user.py에는 Base class를 상속받는 User class를 만들어서 create_all()로 테이블을 생성해 줍니다.

# database/core.py
from sqlalchemy import URL, create_engine

url = URL.create(drivername="mariadb+mariadbconnector", username="hiio420", password="...", host="...",
                 port="...", database="HIIO_ADMIN")

engine = create_engine(url)

# database/entity/base.py
from sqlalchemy.orm import DeclarativeBase


class Base(DeclarativeBase):
    pass
# database/entity/user.py
from sqlalchemy import Column, String

from database.entity.base import Base


class User(Base):
    __tablename__ = "USER"
    __table_args__ = {
        'comment': 'USER TABLE'
    }
    id = Column("USER_ID", String(20), primary_key=True, comment="USER ID")
    password = Column("PASSWORD", String(120), nullable=False, comment="USER PASSWORD")

root 디렉토리에 main.py 를 만들어서 실행 시켜 보면 User 테이블이 만들어 진 것을 볼 수 있습니다.

# main.py
from database import engine, Base

if __name__ == '__main__':
    Base.metadata.drop_all(engine)
    Base.metadata.create_all(engine)

728x90

+ Recent posts