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)
생각이 너무 많았던 회원가입, 로그인 기능 구현하기
문제가 계정명, 핸드폰번호, 이메일 중 한가지
만 택해서 id 개념으로 쓸 수 있다는 것이었는데
세가지 모두를 받되 하나만 id로 사용하겠다는 줄 알고
DB Users테이블의 컬럼을 총 네개로 해야하나..?(password 컬럼 포함)
아니면 한 컬럼내에 모두 받되 type을 가르는 컬럼을 하나 추가해서 어떠한 종류의 id인지 분간할 것인가..?
그럼 id로 쓰려는것을 아무것도 받지 않으면..?
근데 애초에 front단에서 뭐가 되었든 form 안에 담겨서 넘어올 것 같은데
과연 아무 값도 존재하지 않을수가 있나?
value가 없을 뿐 key는 어떻게든 넘어오지 않나?
혼자서 삽질에 삽질👆🏻 을 계속 하고
migrate 에러도 또 내보고(...!!!!)
이번엔 두번째 사고치는거라 오히려 migrate에러는 금방 해결했다.
- 한번에 천천히 수정사항이 반영되도록 해야하는데 models.py에서 클래스 명까지 수정해버렸더니, 해당 테이블을 찾을 수 없다고 에러가 나버리고,
- 이미 클래스명과 일치하는 테이블은 매칭되지 않는 상태에서 migrate할 내역이 없다는 에러만 계속 뜨는 것..!!!
👉🏻 차분하게 migration 파일 내 delete 구간을 지워보기도 하고 난리를 다 쳤는데,
결국 migration 파일 내부를 싹 지우고 migrate 해서 테이블을 없앤 뒤
다시 작성하고 migrate해주면 과정을 차분히^^ 진행할 수 있었다.
뭐든지 천천히..^^
아무튼, 결국 컬럼을 하나로 진행하기로 했다. (그냥 계정명
만 입력받는다고 가정!)
입력받은 id 값과 pw 값 유효성 검사
를 진행한 뒤, 유효성 검사에서 걸리지 않는다면
DB 내에 저장
되도록 구현했다.
filter( )
메서드를 쓰면<QuerySet>
으로 리턴되고,get( )
메서드를 쓰면 model 내 해당 테이블을 구성하는class
가 리턴되었다.
👉🏻중복
되는 id가 있는지 확인하고싶었기에, 그 길이를 셀셀 수 있는filter().count()
메서드를 사용해서
길이가 1이상인 경우 500 status를 반환하도록 했다.
비밀번호 검사도 원래는 8개 이상이면 무조건 통과를 하기로했는데, 정규식
을 써보라고 해서
숫자가 꼭 들어가야 하며 8개 이상인 경우로 수정하였다.
파이썬은 정규식을 위한
re
라는module
이 존재한다
해당 모듈을 import 해서 함수 사용하면 되는 것!
DB에서 get 메서드를 사용해서 입력받은 id와 일치하는 것이 있는지 확인 한 후
겹친다면 비밀번호도 검사하도록 한다.
둘 다 일치한다면 로그인 성공! 그렇지 않다면 예외상황을 리턴해주기로 했다.
이렇게
get()
메서드를 사용해서 한번에 여러가지 field 값들과 대조해 볼 수 있다.
쉽게쉽게 생각하자..!
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에 대한 기본 개념을 좀 공부할 필요가 있다.😭😭