250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- westagram
- Django
- javascript
- django westagram
- typescript
- OSI7계층
- CORS
- node
- 프로미스
- docker
- crud2
- status code
- 호이스팅
- manytomanyfield
- on_delete
- Jest
- nodeJS
- pm2
- JWT
- 노드
- TypeError: this.boardRepository.createBoard is not a function
- 스코프
- 자바스크립트
- wecode
- 트랜잭션
- 실행 컨텍스트
- bcrypt
- rebase
- async/await
- 장고초기세팅
Archives
- Today
- Total
될때까지
((WnB)) 일반 회원가입, 로그인, 호스트 등록하기 기능 구현 본문
728x90
# 일반 회원가입
1. 기존의 서비스는 카카오 소셜 로그인만 가능했다.
DB의 users 테이블에서 kakao_id, kakao_profile_img 컬럼의 값을 NULL TRUE로 변경해줘야지 회원가입이 가능하다.
# users > models.py
from decimal import Decimal
from django.db import models
from core.models import TimeStampModel
class User(TimeStampModel):
...생략...
kakao_id = models.BigIntegerField(unique=True, null=True)
kakao_profile_img = models.CharField(max_length = 500, null=True)
...생략...
class Meta:
db_table = 'users'
2. migrations파일을 만들고 DB에 변경사항을 적용한다.
python manage.py makemigrations
python manage.py migrate
3. MySQL Workbench에서 users테이블을 확인한다.
컬럼(kakao_id와 kakao_profile_img) 설정값이 null true로 변경된 걸 확인할 수 있다.
4. 유저의 first_name, last_name, phone_number, email은 필수로 입력받는다.
회원가입에 성공하려면 아래의 조건을 통과해야한다.
- 키에러
- 이름, 연락처, 이메일 유효성검사
- 이메일 중복 검사
- 연락처 중복 검사
- 모두 통과하면 201 생성
class SignUpView(View):
def post(self, request):
try :
data = json.loads(request.body)
first_name = data['first_name']
last_name = data['last_name']
phone_number = data['phone_number']
email = data['email']
check_first_name(first_name)
check_last_name(last_name)
check_phone_number(phone_number)
check_email(email)
email_exist_user = User.objects.filter(email=email)
if email_exist_user:
return JsonResponse({'message':'EMAIL_ALREADY_EXIST'}, status=409)
phone_exist_user = User.objects.filter(phone_number=phone_number)
if phone_exist_user:
return JsonResponse({'message':'PHONE_ALREADY_EXIST'}, status=409)
User.objects.create(
first_name = first_name,
last_name = last_name,
email = email,
phone_number = phone_number
)
return JsonResponse({'message':'USER_CREATED'}, status=201)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValidationError as e:
return JsonResponse({'message': f'{e}'}, status=400)
그래도 두달만에 시작한 파이썬인데 많이 해봤던 회원가입이라 금방 구현했다.
여기서 주의해야할 점은 get vs filter의 차이다. get을 사용하고 싶었지만.. 아래 이유 때문에 filter를 사용해서 구현했다.
- get : 일치하는 객체가 없으면 DoesNotExistError을 일으킨다.
- filter : 일치하는 객체가 없으면 빈 쿼리셋을 반환한다.
# 로그인
로그인을 하려면.. 비밀번호가 필요한데 User테이블에 비밀번호가 없다!
- 유저 모델에 password 컬럼 생성
- 회원가입 시 password도 입력받기
- password 유효성 검사
- password 암호화
- 회원가입 성공
회원가입 로직을 위처럼 변경하고, 로그인 기능을 구현했다.
- 이메일과 비밀번호 입력받기
- 이메일 불일치 => DoesNotExistError 반환
- 비밀번호 불일치 => 401 에러 반환
- 로그인 성공
- 토큰 발급
로그인 기능 구현할 때 비밀번호가 일치하지 않으면 401 상태코드를 사용했다.
- 401 Unauthorized : 인증되지 않았다.
- 403 Forbidden : 권한이 없다.
그리고 이제까지는 return값으로 메세지와 유저정보를 같이 보내줬는데, data라는 이름으로 데이터들을 한번 더 감싸줬다.
리턴메세지가 훨씬 깨끗해졌다 👍.
return JsonResponse({'message':'LOGIN_SUCCESS', 'data':{'USER_NAME':f'{email_exist_user.last_name}{email_exist_user.first_name}', 'TOKEN':token}}, status=200)
# 호스트 등록하기
- 로그인 한 유저만 호스트로 등록할 수 있다. => 데코레이터 사용
- 이미 호스트로 등록된 유저인지 여부를 확인하기 위해 get_or_create를 사용한다.
- 이미 호스트로 등록된 유저라면 409 반환
- 새로운 유저라면 201 반환
- get_or_create : 객체와 생성여부(boolean)를 튜플로 반환한다.
host_already_exist, is_created = Host.objects.get_or_create(
user_id = user.id
)
이제 저번 프로젝트때 대충 따라했던 호스트 집 등록하기 기능을 구현해보자!
728x90
'프로젝트 > wecode2차 : WnB' 카테고리의 다른 글
((WnB)) 호스트 집 이미지 등록 AWS S3, boto3 사용하여 구현하기 (0) | 2022.10.23 |
---|---|
((WnB)) 호스트 집 인포만 등록하기 (0) | 2022.10.20 |
((WnB)) Poetry 적용하기 (0) | 2022.10.20 |
((WnB)) 팀 프로젝트 이후 개인 깃허브로 옮겨서 작업하기 (0) | 2022.10.20 |
((WnB)) 위코드 2차 프로젝트 회고록 (0) | 2022.08.13 |