🦖 1차 프로젝트 <HOXY LUSH?> 🦖
-> 회원가입&로그인 코드: 내가 구현한 건 SignUpVieww만!
회원가입과 로그인은 사용자가 요청을 보내는 st 이기 때문에 post 메쏘드를 쓴다! 제이슨을 통해 바디에 데이터를 담아 받고 보낸다.
따로 유효성 검사를 validator.py를 만들어서 import해주려고 했는데 그냥 회원가입안에 유효성 검사를 넣어주었다. 프론트랑 유효성검사 코드 확인은 필수! 어떤 조건을 걸어주었는지 프론트에 먼저 얘기해주기!
bcrypt를 활용해서 비밀번호를 해쉬화해주었다. encode 시키고, 다시 decode까지! 이 코드는 외워버렸는데 아주 뿌듯스 👌🏽
마지막으로, 초안을 작성할 때는 create안에 값을 다 따로 써주었었는데, 최종본에서 한번에 괄호로 열어서 다 넣어주니 훨씬 가독성이 올라간다.
import json
import bcrypt
import jwt
import re
from django.views import View
from django.http import JsonResponse
from json.decoder import JSONDecodeError
from users.models import User
from my_settings import SECRET_KEY, ALGORITHM
class SignUpView(View):
def post(self, request):
try:
data = json.loads(request.body)
account = data["account"]
password = data["password"]
email = data["email"]
phone_number = data["phone_number"]
nickname = data.get("nickname")
address = data.get("address")
email_validation = re.compile('^[a-z0-9]+@[a-z0-9]+\.[a-z0-9.]+$', re.I)
password_validation = re.compile('^(?=.*[a-z])(?=.*[0-9]).{8,}', re.I)
if not email_validation.match(email):
return JsonResponse({"MESSAGE" : "INVALID_EMAIL"}, status=400)
if not password_validation.match(password):
return JsonResponse({"MESSAGE" : "INVALID_PASSWORD"}, status=400)
if User.objects.filter(phone_number=data.get('phone_number')).exists() and data.get('phone_number') != None:
return JsonResponse({'MESSAGE': 'ALREADY_EXISTS'}, status = 400)
if User.objects.filter(nickname=data.get('nickname')).exists()\
and data.get('nickname') != None:
return JsonResponse({'MESSAGE' : 'ALREADY_EXISTS'}, status = 400)
hashed_password= bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8")
User.objects.create(
account = account,
password = hashed_password,
email = email,
phone_number = phone_number,
nickname = nickname,
address = address
)
return JsonResponse({"MESSAGE" : "SUCCESS"}, status = 201)
except KeyError:
return JsonResponse({"MESSAGE" : "KEY_ERROR"}, status = 400)
class LogInView(View):
def post(self, request):
try:
data = json.loads(request.body)
user = User.objects.get(account=data["account"])
hashed_password = user.password.encode("utf-8")
if not bcrypt.checkpw(data["password"].encode("utf-8"), hashed_password):
return JsonResponse({"MESSAGE":"INVALID_USER"}, status=401)
access_token = jwt.encode({"account" : user.id}, SECRET_KEY, algorithm = ALGORITHM)
return JsonResponse({"MESSAGE":"SUCCESS", "ACCESS_TOKEN": access_token}, status=200)
except json.JSONDecodeError:
return JsonResponse({"MESSAGE": "KEY_ERROR"}, status=404)
except User.DoesNotExist:
return JsonResponse({"MESSAGE": "INVALID_USER"}, status=404)
except KeyError:
return JsonResponse({"MESSAGE" : "KEY_ERROR"}, status=400)
🥲 예시
🥲 분류: 한줄 제목
- 구현내용 detail
- 구현내용 detail
🥲 Add: User app 생성 및 회원가입 엔드포인트 추가
- 유저 앱을 만들고, 유저 모델 클래스 생성
- 회원가입 엔드포인트 구현
😇 깃헙 익숙하게하기,
git add .
git commit (여기서 커밋메시지 들어가서 써주고 :wq!)
git log
git status
git push origin feature/signup-login
(요기서 signup-login은 미리 만들어둔 브랜치 제목)
(git push할때는 manage.py있는 곳에서 commit+push)
(push하기전에는 pull 모두 다 받기)
😇 멘토님 ok merge나면,
git checkout main (메인으로 먼저가서!)
git pull origin main (메인으로 풀받아오기!)
git branch (name) 새로운 브랜치 하나 파서 시작하기! (브렌치는 메인에 만들자)
😇 pull은 github 메인과 내 local메인사이에서 가능
pull받은 내 local메인의 업데이트 내용을 내 branch에서도 적용해주기 위해서 merge를 시켜주면 됨(in 브렌치, git merge main)
😇 pull받아오면,
😇 혹시 안깔려있으면!
pip install django
pip install client
pip install django-cors-headers