Django ninja api 호출시 사전 Form 요소 검사 - Schema 활용

Django에서 ninja api를 정의하여 호출하는 경우, 데이터베이스의 중복이나 불일치 등등 DB와 연동하여 판단하는 것 말고 폼 객체에 필드 값이 일단 사전에 올바른지 간단하게 체크하는 것이 필요하다. 보통 이런경우 api에서 처리해도 되지만 Schma를 정의해서 처리하는 방법이 있다.

 

자체 공부용으로 정리하는 것이므로 두서 없어도 그냥 넘어가주세요. 여기서 정리한 모든 내용은 현재 듣고 있는 장고 강의에 소스에 포함된 내용을 공부할 겸 추려본다 - Django 실전 프로젝트 1 - URL Shortener 서비스 ( 패스트캠퍼스 )

 

ninja api 구현 함수에 보면 아래와 같이 되어 있다.

 

@api_router.post("register", response={201: None, 409: Message})
def user_register(request, body: UserRegisterBody1):
    print("=== 회원가입 api ===", body)
    email_check = User.objects.filter(email=body.email)

body: UserRegisterBody1 <- 여기가 mapping 되는 지점이 된다.

이 부분에 Schema class 이름을 넣어준다.

즉, Body는 UserRegisterBody1 이 Schema에 맞는 데이터가 들어온다는 얘기다.

 

그럼 UserRegisterBody1 Schema에서 사전 처리하는 기능이 들어 있으면 된다는 얘기가 된다.

그럼 Schema 부분의 코드를 보자.

 

from pydantic.networks import EmailStr  #  pip install 'pydantic[email]'
from pydantic import validator
from uuid import uuid4
from rest_framework.permissions import OR
from shortener.models import Organization
from shortener.models import Users as _users
from ninja import Schema
from django.contrib.auth.models import User as U
from ninja.orm import create_schema
from django.contrib.auth.hashers import make_password

# ...

class UserRegisterBody1(Schema):
    email: EmailStr
    fullname: str
    password: str
    policy: bool

    @validator("password")
    def password_len_check(cls, v):
        print("=== 회원가입 이전 ===", cls, v)
        if v and len(v) >= 8:
            return v
        raise ValueError(f"패스워드는 8자 이상 필수 입니다.")

    @validator("policy")
    def policy_check(cls, v):
        print("=== 회원가입 이전 ===", cls, v)
        if v:
            return v
        raise ValueError(f"이용약관은 필수 동의 사항 입니다.")

    def register(self):

        new_user = U()
        new_user.username = uuid4()
		# 실제 DB 에 넣는 작업들 ...
        
		return new_user

 

머 그 유명한 pydantic 도 보이고, ninja schema 도 보이고, Emailstr 도 보이고 머든 유효성 체크를 위한 라이브러리를 잔뜩 import 하고 있다. 

 

@validator("필드명")

데코레이터 함수를 이용하여 체크를 미리 하게 된다.

글자수, Email 형태 분석, 체크박스 확인 유무 등등 아주 유용하게 사용할 수 있다.

 

물론 이 class 에는 실제 register() 라는 함수도 포함하고 있어 

ninja api 에서 체크가 완료된 데이터를 이 함수를 불러 DB에 입력해 주도록 하면 된다.

 

 카메라 들고 여행은 어디로 가나 잘 찾아가자 코드여행

Monica Turlui 님의 사진, 출처: Pexels