티처프레너스 노트

Django 회원가입 시 아이디/비밀번호 검증하는 로직 (정규식X) 본문

👨‍💻 개발 노트/Python Django

Django 회원가입 시 아이디/비밀번호 검증하는 로직 (정규식X)

행복한엄쌤 2021. 2. 13. 14:16
[상황]
- CBV를 이용해서 Django 프로젝트를 만들고 있다.
- BaseView를 만들어서 post/get 요청을 처리하고 있다. (response에는 data, message, error여부가 담긴다.)

 

넘겨받은 string을 검증식 람다를 통과시키면 된다.

검증하는 람다는 all, any, len을 사용해서 검증하도록 하면 된다.

 

핵심코드

- 검증식

 

def validate_username(self, username): ## 아이디 검증 메소드
    validate_condition = [
    lambda s: all(x.islower() or x.isdigit() or '_' for x in s), ## 영문자 대소문자, 숫자, 언더바(_)만 허용
    lambda s: any(x.islower() for x in s), ## 영어 소문자 필수
    lambda s: len(s) == len(s.replace(" ","")),
    lambda s: len(s) >= 8, ## 글자수 제한
    lambda s: len(s) <= 20, ## 글자수 제한
    ]

    for validator in validate_condition:
        if not validator(username):
            return True

validate_condition 리스트에 검증식을 람다로 넣는다.

 

for 문에서 validate_condition에 들어간 각 람다식을 돌리게 되는데

각 람다 중에 하나라도 False를 반환하면 (통과를 못하면)

validate_username은 True를 반환하게 한다.

 

- 활용식

 

if self.validate_username(username): ## 아이디가 검증을 통과하지 못했다면
    return self.response(message = "올바른 아이디를 입력해주세요. (영어 소문자(필수), 숫자, 언더바(_), 8~20자)", error=True, status = 400)

이 메소드를 활용할 때는 위와 같이 쓰면 된다.

validate_username이 True인 경우, 즉 검증식 람다 중 하나라도 통과하지 못한 것이 있는 경우

에러 메시지를 보낸다.

 

 

사용 예

- 검증 메소드 정의

 

# BaseView
class BaseView(View):
    @staticmethod
    def response(data={}, message='', error=False, status=200):
        result = {
            'data' : data,
            'message' : message,
            'error' : error,
        }
        return JsonResponse(result)

# RegisterView
class UserRegisterView(BaseView):

    def validate_username(self, username): ## 아이디 검증 메소드
        validate_condition = [
            lambda s: all(x.islower() or x.isdigit() or '_' for x in s), ## 영문자 대소문자, 숫자, 언더바(_)만 허용
            lambda s: any(x.islower() for x in s), ## 영어 소문자 필수
            lambda s: len(s) == len(s.replace(" ","")),
            lambda s: len(s) >= 8, ## 글자수 제한
            lambda s: len(s) <= 20, ## 글자수 제한
        ]

        for validator in validate_condition:
            if not validator(username):
                return True

    def validate_password(self, password): ## 비밀번호 검증 메소드
        validate_condition = [
            lambda s: all(x.islower() or x.isupper() or x.isdigit() or (x in ['!', '@', '#', '$', '%', '^', '&', '*', '_']) for x in s), ## 영문자 대소문자, 숫자, 특수문자(리스트)만 허용
            lambda s: any(x.islower() or x.isupper() for x in s), ## 영어 대소문자 필수
            lambda s: len(s) == len(s.replace(" ","")),
            lambda s: len(s) >= 8, ## 글자수 제한
            lambda s: len(s) <= 20, ## 글자수 제한
        ]

        for validator in validate_condition:
            if not validator(password):
                return True

- 검증 메소드 활용

 

def post(self, request):

    ## POST로 받은 값들
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '')
    password2 = request.POST.get('password2', '')
        
    ## 입력/검증 통과 여부 확인
    if not username: ## 아이디를 입력 안 했다면
      return self.response(message = "아이디를 입력하세요.", error=True, status = 400) 

    if self.validate_username(username): ## 아이디가 검증을 통과하지 못했다면
      return self.response(message = "올바른 아이디를 입력해주세요. (영어 소문자(필수), 숫자, 언더바(_), 8~20자)", error=True, status = 400)

    if not password: ## 비밀번호를 입력 안 했다면
      return self.response(message = "비밀번호를 입력하세요.", error=True, status = 400)

    if self.validate_password(password): ## 비밀번호가 검증을 통과하지 못했다면
      return self.response(message = "올바른 비밀번호를 입력해주세요. (영문(대소문자)(필수), 숫자, 특수문자(!, @, #, $, %, ^, &, *, _))", error=True, status = 400)

    if password != password2: ## 비밀번호와 비밀번호 확인란이 다르다면
      return self.response(message = "비밀번호와 비밀번호 확인란에 입력한 내용이 다릅니다.", error=True, status = 400)
      
      
...(이하는 유저를 등록하는 코드)...

 

Comments