루나의 TIL 기술 블로그

위스타그램 1 회원가입기능구현

|

[Mission 1] Django초기 세팅

지난 게시물을 참고하여 만들 수 있다. makemigrations할 때 프로젝트 안에 앱이 2개 이상일때는 뒤에 앱이름을 붙여주어야한다.

python manage.py makemigrations users
python manage.py migrate users
  1. 모델 작성
  2. 프로젝트 settings.py의 installed_app에 앱 이름 추가
  3. makemigrations 실행
  4. 상위 프로젝트 폴더의 urls.py에 경로 추가

[Mission 2] 모델링

#yooyoung > users > models.py
from django.db import models


class User(models.Model):
    name         = models.CharField(max_length=40, null=True)
    #null=True를 넣으면 값이 들어오지 않아도 에러가 나지 않는다.
    email        = models.EmailField(max_length=200, unique=True)
    password     = models.CharField(max_length=200)
    age          = models.PositiveIntegerField(null=True)
    phone_number = models.CharField(max_length=60, null=True)

    class Meta:
        db_table = 'users' #디비 이름 네이밍 컨벤션 : 소문자 복수형

[Mission 3] 회원가입 기능 구현

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

urlpatterns = [
    path("users",include("users.urls"))
]
#yooyoung > users > urls.py
from django.urls import path
from .views      import SignUp

urlpatterns = [
    path("", SignUp.as_view())
]
#yooyoung > users > views.py
from django.views import View
from django.http import JsonResponse
from .models import User
import json
import re


class SignUp(View):
    def post(self, request):
        try:
            data = json.loads(request.body)

            if User.objects.filter(email=data['email']).exists():
                return JsonResponse({"message": "ERROR_EMAIL_ALREADY_EXIST"}, status=400)
                #이메일이 디비에 이미 있는 경우 중복에러
            if (data["email"] == "") or (data["password"] == ""):
                return JsonResponse({"message": "ERROR_EMPTY_EMAIL_OR_PASSWORD"}, status=400)
                #이메일이나 비밀번호가 누락된 경우 에러
            if re.match(r"^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", data["email"]) == None:
                return JsonResponse({"message": "ERROR_EMAIL_NEED_@AND."}, status=400)
                #이메일 형식이 안 맞는 경우 에러
            if re.match(r"^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$", data["password"]) == None:
                #(알파벳이 있고)(숫자가 있고)(특수문자가 있으면)8자 이상의 해당 문자열을 입력받는다.
                # 그래서 특수문자에 넣고싶은 문자가 더 있으면 여기에 추가해주면 된다. 양쪽에 다 추가해야함! 
                return JsonResponse({"message": "ERROR_REQUIRE_8_LETTER,NUMBER,SPECIAL_SYMBOLS)"}, status=400)
                #비밀번호 8자리 이상, 문자, 숫자, 특수문자의 복합아니면 에러

            User.objects.create(
                name         =   data['name'],
                email        =   data['email'],
                password     =   data['password'],
                phone_number =   data['phone_number'],
                age          =   data['age']
            )
            #그렇지 않은 경우 데이터 저장

            return JsonResponse({'Message': 'SUCCESS'}, status=201)
        
        except KeyError:
            return JsonResponse({'message': 'KEY_ERROR'}, status=400)
            #try: except를 써야 예외처리할 수 있다. 키에러일 경우 키에러를 리턴한다.

쉘로 데이터 입력하기

>>>from users.models import User
>>>User.objects.create(name='경훈',email='123@gmail.com',password='!234567eight', age=18, phone_number='01012345678')
<User: User object (1)>
...

httpie POST로 데이터 입력하기

http -v POST 127.0.0.1:8000/app이름/urls등록한이름 컬럼='' 컬럼='' 
공백으로 컬럼을 구분한다.

예를 들자면

http -v POST 127.0.0.1:8000/users name='민' email='min@abc.com' password='*fsgfdlkjhlkjh1' phone='010-1234-5678' age=32

결과값(비밀번호를 대강 쉘로 넣어서 정규표현식이 적용되어있지 않다) mission3 db