파이썬에서 가장 빠른 웹프레임워크 FastAPI Feat. Pydandic



파이썬에서 가장 빠른 웹 프레임워크인 FastAPI, 혹시 저처럼 파이썬이 느려서... 특히 웹프레임워크인 장고와 플라스크가 느려서 고민하셨던 분이 계실까요? 저도 그랬습니다. 어떻게 하면 더 빠르게 할지 매일 고민하고 노력했습니다. 하지만, 분명한 한계는 있었어요. 만약, 제 글을 읽으시는 분들 중이 그런 분들이 계신다면, Pydantic 와 Starlette에 감사하며, 네 번 째 튜토리얼을 시작하겠습니다.





포스팅에 사용된 소스코드 Commit ID : 539a3cfa3a82b01e11a49f39edaeb4f9e0eb0e39



혹시 동영상으로 보고 싶으신 분들을 위해 동영상을 첨부합니다!









1. 엔드포인트 만들기

Github 에서 보시고 계시듯. 엔드포인트를 만들었습니다.

router = APIRouter()


@router.post("/register/{sns_type}", status_code=200, response_model=Token)
async def register(sns_type: SnsType, reg_info: models.UserRegister, session: Session = Depends(db.session)):
    """
    회원가입 API
    :param sns_type:
    :param reg_info:
    :param session:
    :return:
    """
    if sns_type == SnsType.email:
        is_exist = await is_email_exist(reg_info.email)
        if not reg_info.email or reg_info.pw:
            return JSONResponse(status_code=400, content=dict(msg="Email and PW must be provided'"))
        if is_exist:
            return JSONResponse(status_code=400, content=dict(msg="EMAIL_EXISTS"))
        hash_pw = bcrypt.hashpw(reg_info.pw.encode("utf-8"), bcrypt.gensalt())
        new_user = Users.create(session, auto_commit=True, pw=hash_pw, email=reg_info.email)
        token = dict(Authorization=f"Bearer {create_access_token(data=UserToken.from_orm(new_user).dict(exclude={'pw', 'marketing_agree'}),)}")
        return token
    return JSONResponse(status_code=400, content=dict(msg="NOT_SUPPORTED"))


하지만 register함수의 인수인 sns_type: SnsType 이 뭘까요? reg_info는 뭘까요?



2. Pydantic

파이단틱을 사용하여 models.py 를 정의 했습니다. 

Django 였다면, models 에는 데이터베이스 테이블 정보가 있었겠지만, 지금은 아래와 같이 파이단틱 모델들이 들어 있습니다. 

from enum import Enum

from pydantic.main import BaseModel
from pydantic.networks import EmailStr


class UserRegister(BaseModel):
    # pip install 'pydantic[email]'
    email: EmailStr = None
    pw: str = None


class SnsType(str, Enum):
    email: str = "email"
    facebook: str = "facebook"
    google: str = "google"
    kakao: str = "kakao"


class Token(BaseModel):
    Authorization: str = None


class UserToken(BaseModel):
    id: int
    pw: str = None
    email: str = None
    name: str = None
    phone_number: str = None
    profile_img: str = None
    sns_type: str = None

    class Config:
        orm_mode = True


이렇게 들어온 request body 나 다른 모든 데이터 형식의 유효성을 검사해 주는 파이단틱 입니다. Json을 모델로 바꾸고 모델을 Json으로 바꾸며 빠르게 유효성을 검사하고 코딩하기 편하게 해 주면서, 무엇보다.. 들어오는 인풋에 대해 타입을 검사해 줍니다. 이 인풋이 스트링인지, 정수 인지.. 에 대해 검사해주어 더 적게 코딩해도 되게 만들어 주었습니다!


그리고, 제가 위에 말씀드렸어요. 왜 파이단틱 에게 감사해야 한다고.... 파이단틱이 이렇게 빠른 웹프레임워크가 탄생하는데 도움을 주었습니다. 



django rest framework 와는 넘사벽 차이

 




너무 좋아서 웹프레임워크에만 쓰기 너무 아깝습니다. 사내 데이터 사이언티스트 분들께 데이터 벨리데이션을 위한 방법을 곧 알려드릴 예정입니다. 

이렇게 좋은 라이브러리는 제대로 소개하는 자리가 필요하다고 생각 합니다. 유투브 동영상은 프로젝트를 만드는데에 치중되어 있지만, Pydantic 의 우수성을 블로그에서는 알리고 싶었습니다! 꼭 소개하는 공간을 만들겠습니다!


  • [[a.original_name]] ([[a.file_size | fileSizer]])
'FastAPI 프로젝트' 시리즈 포스트
Python FastAPI 로 백엔드 만들기 3화 - MySQL 연결
2020-12-27
Python FastAPI 로 백엔드 만들기 2화 - 프로젝트 구조
2020-12-21
FastAPI 1화 - 프로젝트 생성
2020-12-18
파이썬에서 가장 빠른 웹프레임워크 FastAPI Feat. Pydandic
2021-01-04
Python으로 로그인 구현하기 (JWT X FastAPI)
2021-01-07
Node.js 아성에 도전한다. FastAPI written in Python
2020-10-13
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'파이썬' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]