[Djagno] Westagram 회원가입 기능 구현

2021. 8. 29. 22:59코딩일지/Django

1. Westagram 시작하기

 ※ Django 초기 환경 세팅 및 모델링

 

아래 링크를 참고하여 초기 환경 세팅 및 모델링

https://woojuscodingroom.tistory.com/13

https://woojuscodingroom.tistory.com/14

 

클래스명 User 및 users 테이블 생성

클래스, 함수, 그리고 변수들의 이름을 짓는 데에는 규칙이 있습니다. 

  • 이름
  • 이메일
  • 비밀번호
  • 연락처(휴대폰)
  • 그 외 개인정보 (저는 생년월일로 했습니다)
from django.db import models

class User(models.Model):
    name          = models.CharField(max_length=45)
    email         = models.CharField(max_length=300)
    password      = models.CharField(max_length=500)
    phone_number  = models.CharField(max_length=20)
    date_of_birth = models.DateField()

    class Meta:
        db_table  = 'users'

 # 패스워드에 500자인 이유는 나중에 포스팅할 암호화를 위해서 길게 주었습니다. 

 

2.  회원가입을 위한 Views.py 작성

 ※ View 파일 조건 및 정규표현식

 

정규표현식에 관한 자료는 아래의 링크에 두겠습니다.

(링크)

  • 회원가입을 위한 View 를 작성해야 합니다. 사용자 정보는 이름, 이메일, 비밀번호, 연락처(휴대폰), 그 외 개인정보를 포함한다.
  • 이메일이나 패스워드가 전달되지 않을 경우, {"message": "KEY_ERROR"}, status code 400을 반환합니다.
  • 이메일에는 @와. 이 필수로 포함되어야 합니다. 해당 조건이 만족되지 않은 경우 적절한 에러를 반환해주세요. 이 과정을 Email Validation이라고 합니다. 정규표현식을 활용해주세요.
  • 비밀번호는 8자리 이상, 문자, 숫자, 특수문자의 복합이어야 합니다. 해당 조건이 만족되지 않은 경우, 적절한 에러를 반환해주세요. 이 과정을 Password Validation이라고 합니다. 정규표현식을 활용해주세요.
  • 회원가입 시 서로 다른 사람이 같은 이메일을 사용하지 않으므로 기존에 존재하는 자료와 중복되면 안 됩니다. 적절한 에러를 반환해주세요.
  • 회원가입이 성공하면 {"message": "SUCCESS"}, status code 201을 반환합니다.

위에서 부터 천천히 작성해보겠습니다.

 

1) 사용자 정보 및 에러코드 기입

import json

from django.http import JsonResponse
from django.views import View

from users.models import User

class UsersView(View):
    def post(self, request):
        try:
            data     = json.loads(request.body)
            
           	User.objects.create(
                name          = data['name'],
                email         = data['email'],
                password      = data['password'],
                phone_number  = data['phone_number'],
                date_of_birth = data['date_of_birth'],
                )
                
            return JsonResponse({'MESSAGE':'CREATE'}, status=201)

        except KeyError:
            return JsonResponse({'MESSAGE':'KEY_ERROR'}, status=400)

 

2) email과 password에 대한 조건식을 부합하기 위한 조건 삽입

 

email과 password의 데이터를 불러올 수 있게끔 로직의 맨 위쪽에 데이터 파일을 기입합니다.

class UsersView(View):
    def post(self, request):
        try:
            data     = json.loads(request.body)
            email    = data['email']
            password = data['password']

 

이후 정규표현식을 사용하기 위하여 python에서 지원하는 re모듈을 import 해주고 email과 password의 조건의 부합하게 코드를 기입합니다.

import json, re

from django.http import JsonResponse
from django.views import View

from users.models import User

class UsersView(View):
    def post(self, request):
        try:
            data     = json.loads(request.body)
            email    = data['email']
            password = data['password']
            
            Valid_email = re.compile('^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
            if not Valid_email.match(email):
                return JsonResponse({'MESSAGE':'EMAIL_VALIDATION'}, status=400)
            
            Valid_password = re.compile('^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$')
            if not Valid_password.match(password):
                return JsonResponse({'MESSAGE':'PASSWORD_VALIDATION'}, status=400)

 # email = 반드시 @와 .이 필수로 표현되어야 하기에 문자열의 시작인 ^로 시작하여 <^ []아이디값의 조건식 +@[] 이메일 주소의 조건식 +★\. 인터넷 최상위 도메인의 조건식+$ >  $로 닫아서 표현할 수 있다.

★ (.) 앞에 \가 있는 이유는 (.)만 쓰일 경우 특수문자로 인식될 수 있기에 \를 사용하여 앞을 비워 문자열로 인식되게 만들 수 있다.

 

 # password = 최소 하나의 문자, 숫자, 특수문자의 복합 및 8글자 이상되어야 하기에 <^(?=.*[A-Za-z])문자의 조건식 (?=.*\d) 숫자의 조건식 (?=.*[$@$!%*#?&])특수문자의 조건식[A-Za-z\d$@$!%*#?&] 허용되는 문자의 조건식{8,}8글자 이상을 나타내는 조건식 $')으로 표현될 수 있다.

 

 ★?=은 전방 탐색의 의미로 앞에서부터 하나하나 탐색해나간다는 의미고, (.)은 줄 바꿈을 제외한 모든 문자를 뜻하고 *은 앞에 나온 문자와 0번 이상 일치한다라는 이야기이므로 종합하자면 앞에서부터 모든 문자를 탐색해 나간다고 보면 됩니다.

예를 들자면,?=.*[a-zA-z]는 a-z A-Z 중 하나라도 쓰였는가에 대해 판단하는 것을 의미합니다.

 

3) 서로 중복되지 않는 이메일 가입조건

 

서로 중복되지 않게끔 filter()와 exists를 사용해 emai의 중복 생성을 오류 처리합니다.

class UsersView(View):
    def post(self, request):
        try:
            data     = json.loads(request.body)
            email    = data['email']
            password = data['password']

            Valid_email = re.compile('^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
            if not Valid_email.match(email):
                return JsonResponse({'MESSAGE':'EMAIL_VALIDATION'}, status=400)
            
            Valid_password = re.compile('^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$')
            if not Valid_password.match(password):
                return JsonResponse({'MESSAGE':'PASSWORD_VALIDATION'}, status=400)
            
            if User.objects.filter(email=email).exists():
                return JsonResponse({'MESSAGE':'AlREADY_EXISTED_EMAIL'}, status=400)

 

이렇게 하여 회원가입을 위한 조건식을 모두 만족한 views.py를 모두 만들어 주었습니다.

확인을 위해서 urls.py로 가서 urls path값을 주도록 하겠습니다.

 

3. URLconf 정의

 ※ 클라이언트의 요청을 받아서 회원가입 뷰를 호출할 수 있도록 urls.py를 작성해야 합니다. 

from django.urls import path
from users.views import UsersView

urlpatterns = [
    path('/sign-up', UsersView.as_view()),
]

 

4.  httpie를 이용한 회원가입 확인

※ httpie -v POST를 이용해 회원가입 및  오류 확인

http -v POST 127.0.0.1:8000/users/sign-up name='개똥이' email='dogddong@naver.com' pa
ssword='zxcv1234@@' phone_number=010-1234-1234 date_of_birth=2002

성공적으로 만들어지고 201 코드, CREATE메시지가 출력되는 것을 볼 수 있습니다.

 

※ 에러코드 호출에 대해서 확인해보겠습니다.

 

생년월일을 다르게 하고 이름을 넣지 않았지만 이메일을 동일하게 만든다면 400 에러를 출력하고 미리 지정해두었던 already_existed_email 출력하게 됩니다.

 

이메일에 @를 넣지 않고 생성하면 400 에러와 저장해둔 email_validation오류를 출력합니다. 

 

마지막 비밀번호에 특수문자를 넣지 않으니 400 에러를 출력하고 password_validation 에러 메시지를 출력하게 됩니다.

 

다양한 조건식과 정규표현식을 이용해서 까다로운 조건을 만족시킬 수 있는 회원가입의 로직을 구성하는 방법을 배워서 뿌듯했습니다,.

다음에는 로그인 기능 및 비밀번호 암호화 로그인 JWT적용으로 찾아뵙겠습니다.

감사합니다.

'코딩일지 > Django' 카테고리의 다른 글

[Django] Selected_related와 Prefetch_related  (0) 2021.09.11
[Django] Pagination과 offset, limit  (0) 2021.09.05
[Django] ManytoManyField  (0) 2021.08.26
[Django]C.R.U.D (3)  (0) 2021.08.26
[Django] C.R.U.D (2)  (0) 2021.08.21