Django | WeStagram 3. 회원가입

김민호·2021년 9월 24일
0

DJANGO

목록 보기
3/18
post-thumbnail

현재 진행 단계 : 초기 세팅 완료, users 앱 생성, models.py의 User 클래스 작성 완료하여 DB에 migrate까지 끝난 상황

✅ password 의 속성으로 max_length=200을 준 이유
비밀번호가 추후에 암호화되면서 길어질 경우를 대비
created_at, updated_at column 작성 이유
데이터 이력 관리를 위해. DateTimeField는 날짜와 시간 생성해주는 메소드
created_at : 처음 생성된 시점. auto_now_add = True 는 처음 생성된 시점 자동으로 기록
updated_at : 업데이트 된 시점. auto_now = True 는 업데이트 되는 시점 자동으로 기록
✅ 변수명에 쓰는 =는 가장 긴 변수명의 한 칸 뒤를 기준으로 쓰자

1. 인스타그램 회원가입

입력 정보와 Validation

입력정보

  • 입력받을 수 있는 정보는 폰번호or이메일, 성명, 사용자이름(id), 비번

Validation

  1. 이메일 or 비번이 전달되지 않으면 {"message": "KEY_ERROR"}, status code 400 반환
  2. 이메일 형식 : @. 반드시 포함, 없을 경우 에러 반환
  3. 비번 형식 : 8자리 이상 & 문자+숫자+특수문자 포함, 아닐 경우 에러 반환
  4. 새로 가입하려는 이메일은 기존의 이메일과 중복되면 안됨, 중복 시 에러 반환
  5. 회원가입 성공 시 {"message": "SUCCESS"}, status code 201 반환

users/views.py 작성

1

  • 회원가입을 위해 사용되는 핸들러메소드는 post이다
  • 회원가입에 필요한 정보는 client로부터 Json형식으로 request.body에 담겨서 온다
  • data = json.loads(request.body) 는 client로부터 받은 정보를 파이썬에서 사용할 수 있는 dictionary 형태로 바꾸어 주고 이를 data라는 변수에 담았다
  • data는 객체이고 그 Key로 value를 불러서 각각 name ~ phone_number 에 담는다

2

  • 이메일과 비번 정규식
  • 이메일은 @. 그리고 비번은 8자리 이상 & 문자+숫자+특수문자 를 포함해야 한다는 정규표현식
  • 물론 정규식을 완벽하게 이해하고 쓴 것은 아니다... 공부하자!

3

  • re.match(패턴, 패턴을 찾을 문자열)
import re

email = "rlaalsgh@gmail.com"
email_regex = "^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

print(re.match(email_regex, email))
# <re.Match object; span=(0, 18), match='rlaalsgh@gmail.com'>
  • 만약에 이메일에 @없이 해본다면 None 반환
import re


email = "rlaalsghgmail.com"
email_regex = "^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

print(re.match(email_regex, email))
# None
  • 그래서 이메일 정규식과 요청으로 받은 데이터 email을 비교해서 일치하지 않는다면 JsonResponse({'MESSAGE':'INVALID_EMAIL'}, status=400)를 반환하도록 설정
    비번도 마찬가지

4

자주 사용되는 Model Method인 filter()와 exists() 리마인드

  • filter() : filter(**kwargs): 키워드 인자로 주어진 lookup 조건에 일치하는 레코드들의 QuerySet 반환
case1
In  : Category.objects.filter(name='브루드커피')
Out : [<Category: Category object (3)>, <Category: Category object (4)>]
case2
In  : Category.objects.filter(name='브루드커피').filter(id=3)
Out : [<Category: Category object (3)>]
case3
In  : Category.objects.filter(name='브루드커피').exclude(id=3)
Out : [<Category: Category object (4)>]
  • exists() : filter()와 함께 서용해서 filter 조건에 맞는 데이터가 있는지 조회, 존재하면 True 존재하지 않으면 False를 반환 (QuerySet을 반환하지 않음)
In  : Category.objects.filter(name='브루드커피').exists()
Out : True

위 코드는 User객체에서 email key가 데이터로 받은 data['email']과 같은 것을 찾아서 True이면 return 값을 반환한다. 다시 말해서 아이디가 이미 존재한다면 에러 메세지를 반환하는 것

5

위 3가지 if문이 통과될 시 create() 메소드로 User 객체를 생성한다. 각각의 column에는 request.body로 온 데이터가 담기고 이게 DB users테이블에 추가가 되는 것 = 회원가입 ㅊㅋㅊㅋ그리고 회원가입 성공 메세지 반환

6. 회원가입 전체 코드

2. url 경로 이해하기

1) westagram/urls.py

2) users/urls.py

http -v POST localhost:8000/users🔴/signup🔵 email="thsrudgns@gmail.com" password="thsrudgns22@" name="손경훈" other_info="다른정보" phone_number="010-4545-4545"
🔴 여기 써있는 users는 타겟이라 불리고 이 타겟을 프로젝트 파일의 urls.py에서 먼저 인식을 하고 include('users.urls')를 통해 users 앱의 urls.py로 보낸다. 그럼 이 urls.py의 path에서 🔵signup을 인식하고 views.py에 작성해놓은 SignUpView 클래스로 보낸다. SignUpView.as_view() as_view()라는 소스코드를 뜯어보면 대문자를 소문자로 변환시켜주는 함수가 구현돼 있고 그걸 통해 http 요청에서 대문자로 들어온 POST를 소문자 post로 인식하고 SignUpView 클래스 안의 post 함수를 실행시키면서 위의 과정이 쭉 실행되는 것이다

profile
개발자로서의 삶은 https://velog.io/@maxminos 에서 기록하고 있습니다 😀

0개의 댓글