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 |
29 | 30 |
Tags
- 실행 컨텍스트
- crud2
- rebase
- OSI7계층
- CORS
- status code
- django westagram
- nodeJS
- node
- JWT
- 호이스팅
- 프로미스
- manytomanyfield
- bcrypt
- pm2
- 자바스크립트
- Django
- wecode
- typescript
- westagram
- docker
- 장고초기세팅
- Jest
- 노드
- on_delete
- javascript
- 스코프
- TypeError: this.boardRepository.createBoard is not a function
- 트랜잭션
- async/await
Archives
- Today
- Total
될때까지
((WnB)) 8일차 : get_or_created의 defaults 본문
728x90
class KakaoOauthView(View):
def get(self, request):
token = request.META.get('HTTP_AUTHORIZATION')
KAKAO_URL = 'https://kapi.kakao.com/v2/user/me'
HEADER = {'Authorization': token}
user_info = requests.get(KAKAO_URL,headers=HEADER).json()
kakao_id = user_info['id']
kakao_profile_img = user_info['kakao_account']['profile']['profile_image_url']
email = user_info['kakao_account']['email']
user, created = User.objects.get_or_create(
kakao_id = kakao_id
)
if created:
user.kakao_profile_img = kakao_profile_img
user.email = email
user.save()
return JsonResponse({'message':'SIGNUP_SUCCESS'}, status=201)
처음 작성했던 카카오 회원가입/로그인의 로직은 위와 같다. 멘토님의 리뷰가 'get_or_create()에 defaults 옵션을 이용해보세요!' 라고 달렸다. get_or_create()에 defaults 옵션이 뭘까?
get_or_create
- 객체를 검색하는데 해당 객체가 없다면 인스턴스를 생성한다.
- defaults는 인스턴스가 새로 생성될 때에만 사용되는 옵션이다.
user, created = User.objects.get_or_create(
'first_name' = '이름',
'last_name' = '성',
defaults = {
'birth_day' : '2022-08-08'
}
)
- get_or_create는 (object, created)의 튜플 형태로 반환한다.
- created에는 생성이면 true가 담기고, 이미 해당 객체가 있다면 false의 불린값을 담아 반환한다.
- 이름이 이름, 성이 성인 객체가 있다면 user에 해당 객체가 담기고 created는 false가 된다.
- 이름이 이름, 성이 성인 객체가 없다면 created는 true가 되고 인스턴스가 새로 생성된다.
- defaults에 적어둔 내용은 인스턴스가 새로 생성될 때에만 생성되기 때문에 이름=이름, 성=성, 생년월일=2022-08-08인 인스턴스가 생성된다.
import requests
import jwt
from django.conf import settings
from django.http import JsonResponse
from django.views import View
from users.models import User
class KakaoOauthView(View):
def get(self, request):
token = request.META.get('HTTP_AUTHORIZATION')
KAKAO_URL = 'https://kapi.kakao.com/v2/user/me'
HEADER = {'Authorization': token}
user_info = requests.get(KAKAO_URL,headers=HEADER).json()
kakao_id = user_info['id']
kakao_profile_img = user_info['kakao_account']['profile']['profile_image_url']
email = user_info['kakao_account']['email']
# kakao_id가 일치하는 객체가 있다면, user에 해당 객체가 담기고 created는 false가 된다.
# kakao_id가 일치하는 객체가 없다면, 해당 인스턴스를 생성하고 created는 true가 된다.
# defaults는 생성될 때만 사용된다.
user, created = User.objects.get_or_create(
kakao_id = kakao_id,
defaults = {
'kakao_profile_img': kakao_profile_img,
'email' : email
}
)
# created가 false면 이미 존재한다는 뜻 => 회원가입되어있으므로 => 로그인이다! => not false는 true가 되서 아래 코드들을 실행하고 로그인 성공을 반환한다.
if not created:
user.kakao_proifile_img = kakao_profile_img
user.save()
token = jwt.encode({'id':user.id}, settings.SECRET_KEY, settings.ALGORITHM)
return JsonResponse({'message':'SIGNIN_SUCCESS', 'token':token}, status=200)
return JsonResponse({'message':'SIGNUP_SUCCESS'}, status=201)
728x90
'프로젝트 > wecode2차 : WnB' 카테고리의 다른 글
((WnB)) 10일차 : 호스트 집 등록 API, S3, transaction (0) | 2022.08.10 |
---|---|
((WnB)) 9일차 : 포스트맨 왜케 어려워 (0) | 2022.08.09 |
((WnB)) 7일차 : 테스트 코드 작성 (0) | 2022.08.07 |
((WnB)) 6일차 : 사용자 추가 정보 입력받기 (0) | 2022.08.06 |
((WnB)) 6일차 : 로그인 데코레이터 포스트맨으로 테스트하기 (0) | 2022.08.06 |