[Django] 회원가입 기능 구현

김광일·2022년 2월 22일
0

DJANGO

목록 보기
4/8
post-thumbnail

이전 포스팅에서 회원가입 모델을 만들어봤으니, 이제 그 모델을 이용하여 회원가입 기능을 구현해보려한다.


1. email과 password의 정규표현식 정의

먼저 정규 표현식을 사용하여 emailpassword의 형식을 지정해준다.

# users/validation.py

import re

def email_validation(email):
    EMAIL_REGEX = re.match(r"^([0-9a-zA-Z]?[+-_.]?[0-9a-zA-Z])+@[a-zA_Z-]+[.][a-zA_Z-]+$", email)
    return EMAIL_REGEX

def password_validation(password):
    PASSWORD_REGEX = re.match(r"^(?=.*[a-zA-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}", password)
    return PASSWORD_REGEX
  • import re
    : 파이썬 내에서 정규 표현식을 지원하기 위해 제공하는 모듈로, 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리이다.
  • EMAIL_REGEX
    : re.compile로 먼저 지정해주고, match를 사용하지 않은 이유는 굳이 중복되지 않는 상황에 가독성을 높이고 효율을 높이기 위해서 re.match를 사용하였다.
    @.을 필수로 포함하게 정규 표현식을 작성하였다.
  • PASSWORD_REGEX
    : 문자(대소문자 구분하지 않음), 숫자, 특수문자를 필수로 포함하게 하는 정규 표현식을 작성하였다.

2. 회원가입 View 기능 정의

# users/views.py

import json

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

from .models      import User
from .validation  import email_validation, password_validation

class SignUpView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            first_name   = data["first_name"]
            last_name    = data["last_name"]
            email        = data["email"]
            password     = data["password"]
            phone_number = data["phone_number"]

            if not email_validation(email): #1
                if not password_validation(password):
                    return JsonResponse( {"message" : "INVALID_EMAIL & PASSWORD"}, status = 403)
                else:
                    return JsonResponse( {"message" : "INVALID_EMAIL"}, status = 403)

            if not password_validation(password): #2
                return JsonResponse( {"message" : "INVALID_PASSWORD"}, status = 403)
                
            if User.objects.filter(email = email).exists(): #3
                return  JsonResponse( {"message" : "Email Already Exists"}, status = 400)
                
            User.objects.create(
                first_name   = first_name,
                last_name    = last_name,
                email        = email,
                password     = password,
                phone_number = phone_number
            )
                    
            return JsonResponse( {"message" : "SUCCESS"}, status = 201) #4
        except KeyError:
            return JsonResponse( {"message" : "KEYERROR"}, status = 400)
  • #1
    : emailpassword의 형식이 맞지 않으면 INVALID_EMAIL & PASSWORD 메세지와 함께 에러를 반환한다.
    email은 형식에 맞지 않지만 password가 형식에 맞다면 INVALID_EMAIL 메세지와 함께 403 에러를 반환한다.
  • #2
    : password의 형식이 맞지 않으면 INVALID_PASSWORD 메세지와 함께 403에러를 반환한다.
  • #3
    : 이메일이 이미 존재한다면 Email Already Exists 메세지와 함께 400 에러를 반환한다.
  • #4
    : 이메일과 비밀번호의 형식도 맞고, db에 존재하지 않는 이메일의 형식이라면 SUCCESS 메세지와 함께 새로운 db 정보를 생성한다.

3. URLconf 정의

# westagram/urls.py

from django.urls import path,include

# http://127.0.0.1:8000/users
urlpatterns = [
    path('users', include('users.urls'))
] 


# users/urls.py

from django.urls import path
from .views import SignUpView

# http://127.0.0.1:8000/users/signup
urlpatterns = [
    path('/signup', SignUpView.as_view()), #1
]
  • #1
    : as_view 를 사용함으로써 GET, POST를 더 간단하게 사용할 수 있다.

참고 사이트
as_view 참고

profile
부족함 없이 공부하자

0개의 댓글