파이썬에서 가장 빠른 웹 프레임워크인 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으로 바꾸며 빠르게 유효성을 검사하고 코딩하기 편하게 해 주면서, 무엇보다.. 들어오는 인풋에 대해 타입을 검사해 줍니다. 이 인풋이 스트링인지, 정수 인지.. 에 대해 검사해주어 더 적게 코딩해도 되게 만들어 주었습니다!
그리고, 제가 위에 말씀드렸어요. 왜 파이단틱 에게 감사해야 한다고.... 파이단틱이 이렇게 빠른 웹프레임워크가 탄생하는데 도움을 주었습니다.

너무 좋아서 웹프레임워크에만 쓰기 너무 아깝습니다. 사내 데이터 사이언티스트 분들께 데이터 벨리데이션을 위한 방법을 곧 알려드릴 예정입니다.
이렇게 좋은 라이브러리는 제대로 소개하는 자리가 필요하다고 생각 합니다. 유투브 동영상은 프로젝트를 만드는데에 치중되어 있지만, Pydantic 의 우수성을 블로그에서는 알리고 싶었습니다! 꼭 소개하는 공간을 만들겠습니다!
- [[a.original_name]] ([[a.file_size | fileSizer]])