티처프레너스 노트
Django 회원가입 시 아이디/비밀번호 검증하는 로직 (정규식X) 본문
[상황]
- 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)
...(이하는 유저를 등록하는 코드)...
'👨💻 개발 노트 > Python Django' 카테고리의 다른 글
python - 가상환경에 Mysqlclient 설치하기 (0) | 2021.02.02 |
---|---|
AWS EC2에 MariaDB설치하고 Django로 연동시키기 (0) | 2021.02.02 |
Comments