[ PROJECT ] Westagram Endpoint 구현 (2) - 회원가입, 로그인

Hailee·2020년 12월 9일
0

[ PROJECT ]

목록 보기
1/16
post-thumbnail

Code 👩‍💻

import json
import re

from django.http        import JsonResponse
from django.views       import View
from user.models        import User

# sign up
class Signup(View):
    def post(self, request):
        try:
            data        = json.loads(request.body)
            if data.get('user_name') is not None:
                if data.get('password') is not None:
                    if User.objects.filter(user_name=data['user_name']).count() > 0:
                        return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
                    if re.search('[0-9]+', data['password']) is None:
                        return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
                    User.objects.create(
                        user_name   = data['user_name'],
                        password    = data['password']
                    )
                    return JsonResponse({'message':'SUCCESS'}, status=200)
                else:
                    return JsonResponse({'message':'KEY_ERROR'}, status=400)
            else:
                return JsonResponse({'message':'KEY_ERROR'}, status=400)
        except:
            return JsonResponse({'message':'KEY_ERROR'}, status=400)

# sign in
class Signin(View):
    def post(self, request):
        data = json.loads(request.body)
        try:
            user_count = User.objects.filter(user_name=data['user_name']).count()
            signin_check = User.objects.get(user_name=data['user_name'])
            if user_count == 1:
                if signin_check.user_name == data['user_name'] and signin_check.password == data['password']:
                    return JsonResponse({'message':'SUCCESS'}, status=200)
            else:
                return JsonResponse({'message':'INVALID_USER'}, status=401)    
        except:
            return JsonResponse({'message':'INVALID_USER'}, status=401)

생각이 너무 많았던 회원가입, 로그인 기능 구현하기

- View 작성하기

문제가 계정명, 핸드폰번호, 이메일 중 한가지만 택해서 id 개념으로 쓸 수 있다는 것이었는데
세가지 모두를 받되 하나만 id로 사용하겠다는 줄 알고

  • DB Users테이블의 컬럼을 총 네개로 해야하나..?(password 컬럼 포함)

  • 아니면 한 컬럼내에 모두 받되 type을 가르는 컬럼을 하나 추가해서 어떠한 종류의 id인지 분간할 것인가..?

  • 그럼 id로 쓰려는것을 아무것도 받지 않으면..?
    근데 애초에 front단에서 뭐가 되었든 form 안에 담겨서 넘어올 것 같은데

  • 과연 아무 값도 존재하지 않을수가 있나?
    value가 없을 뿐 key는 어떻게든 넘어오지 않나?

혼자서 삽질에 삽질👆🏻 을 계속 하고
migrate 에러도 또 내보고(...!!!!)

이번엔 두번째 사고치는거라 오히려 migrate에러는 금방 해결했다.

  • 한번에 천천히 수정사항이 반영되도록 해야하는데 models.py에서 클래스 명까지 수정해버렸더니, 해당 테이블을 찾을 수 없다고 에러가 나버리고,
  • 이미 클래스명과 일치하는 테이블은 매칭되지 않는 상태에서 migrate할 내역이 없다는 에러만 계속 뜨는 것..!!!
    👉🏻 차분하게 migration 파일 내 delete 구간을 지워보기도 하고 난리를 다 쳤는데,
    결국 migration 파일 내부를 싹 지우고 migrate 해서 테이블을 없앤 뒤
    다시 작성하고 migrate해주면 과정을 차분히^^ 진행할 수 있었다.

뭐든지 천천히..^^

아무튼, 결국 컬럼을 하나로 진행하기로 했다. (그냥 계정명만 입력받는다고 가정!)

1) 회원가입

입력받은 id 값과 pw 값 유효성 검사를 진행한 뒤, 유효성 검사에서 걸리지 않는다면
DB 내에 저장되도록 구현했다.

  • filter( ) 메서드를 쓰면 <QuerySet> 으로 리턴되고,
  • get( ) 메서드를 쓰면 model 내 해당 테이블을 구성하는 class가 리턴되었다.
    👉🏻 중복되는 id가 있는지 확인하고싶었기에, 그 길이를 셀셀 수 있는 filter().count() 메서드를 사용해서
    길이가 1이상인 경우 500 status를 반환하도록 했다.

비밀번호 검사도 원래는 8개 이상이면 무조건 통과를 하기로했는데, 정규식을 써보라고 해서
숫자가 꼭 들어가야 하며 8개 이상인 경우로 수정하였다.

파이썬은 정규식을 위한 re라는 module이 존재한다
해당 모듈을 import 해서 함수 사용하면 되는 것!

2) 로그인

DB에서 get 메서드를 사용해서 입력받은 id와 일치하는 것이 있는지 확인 한 후
겹친다면 비밀번호도 검사하도록 한다.

둘 다 일치한다면 로그인 성공! 그렇지 않다면 예외상황을 리턴해주기로 했다.

이렇게 get()메서드를 사용해서 한번에 여러가지 field 값들과 대조해 볼 수 있다.
쉽게쉽게 생각하자..!

urls.py 작성하기

from django.urls import path

from user.views import Signup, Signin

urlpatterns = [
    path ('/signup', Signup.as_view()),
    path ('/signin', Signin.as_view()),
]

작업 초기에 class형view(**CBV**)함수형 뷰(**FBV**)의 차이를 몰라서 도저히 작업을 할 수 없었다.
view 내에 두 형식의 view를 혼합해서 사용한 것!
그 결과, 메서드가 self, request를 동시에 매개변수로 못받는 상황이 발생했다.

그리고 그 때에는 urls.py도 각 기능에 따른 url마다
클래스 자체를 import 해준 뒤 메서드를 직접 선언해서 사용하려 했다.

알고보니 클래스명.메서드명으로 바로 urls.py에서 선언해서 사용하는 것은 FBV!
그리고 내가 실습 중이었던 것은 CBV!
내 마음대로 함수명을 지정하면 안된다.
CBV는 HTTP 메서드를 기반으로 구현되어있기 때문..!!

** View에 대한 기본 개념을 좀 공부할 필요가 있다.😭😭

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글