django로 회원가입 및 로그인을 구현해 봅시다!!
먼저 장고 기본적인 초기세팅을 해주었습니다.
그이후 feature/users 라는 브랜치를 생성해서 이 브랜치에서 작업을 해줄것 입니다...
회원가입과 로그인을 구현하기 위한 어플리케이션을 생성해 줍시다~
python manage.py startapp users 명령어를 입력해줍니다.

그러면 users앱이 생성된 것을 보실수 있습니다.
이후 setting.py에 가셔서 INSTALLED_APPS에 'users'를 축가해 줍니다.
자 이제 모델을 작성해 줄 차례입니다.
users 폴더안에 models.py에 작성을 해줍니다.
from django.db import models
class User(models.Model):
username = models.CharField(max_length=50)
email = models.CharField(max_length=100, unique=True) #하나의 email에 하나의 계정만 만들기 위해 uique를 사용하였습니다.
password = models.CharField(max_length=50)
phone_number = models.CharField(max_length=50)
ect_info = models.CharField(max_length=200, null=True) #추가 정보는 필수 정보가 아니기 때문에 null을 추가하었습이다.
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'users'
모델을 작성해 줬다면 데이터베이스에 모델정보를 전달해 줍니다.
python code를 database에 적용하기 위한 migration 파일(설계도)를 만들어 줍니다.
python manage.py makemigrations users을 입력해 줍니다.
이제 makemigration으로 생성한 migration 파일(설계도)을 database에 적용해 줍시다.
python manage.py migrate 을 입력해 줍니다.
그럼 이제 데이터베이스에 모델의 정보가 잘들어 갔는지 확인해 보겠습니다.

잘 들어 갔네요~~
이제 회원가입 기능구현을 위해 view를 작성해 줍니다.
import json, re, bcrypt
from django.http import JsonResponse
from django.views import View
from users.models import User
class SignUpView(View):
def post(self, request):
try:
data = json.loads(request.body)
user_name = data['user_name']
email = data['email']
password = data['password']
phone_number = data['phone_number']
ect_info = data['ect_info']
regex_email = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9-.]+$'
regex_password = "^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$"
if not re.match(regex_email,email):
return JsonResponse({'message' : 'INVALID_EMAIL'}, status=400)
if not re.match(regex_password,password):
return JsonResponse({'message' : 'INVALID_PASSWORD'}, status=400)
if User.objects.filter(email=email).exists():
return JsonResponse({'message':'email_already_exists'}, status=400)
User.objects.create(
user_name = user_name,
email = email,
password = bcrypt.hashpw(password.encode('utf-8'),bcrypt.gensalt()).decode('utf-8'),
phone_number = phone_number,
ect_info = ect_info,
)
return JsonResponse({'message' : 'SUCCESS'}, status=201)
except KeyError:
return JsonResponse({"message":"KEY_ERROR"}, status=400)
정규식을 이용하여 email과 password의 특수한 조건에 해당할수 있게 해줍니다.
password는 데이터베이스에 들어가기 전에 암호화 해준 다음에 넣어줍니다.
class SignInView(View):
def post(self, request):
try:
data = json.loads(request.body)
user = User.objects.get(email=data['email'])
if not bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
return JsonResponse({'message':'INVALID_USER'},status=401)
access_token = jwt.encode({'id': user.id}, settings.SECRET_KEY, algorithm = settings.ALGORITHM)
return JsonResponse({'access_token' : access_token,},status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'VALUE_ERROR'}, status=400)
except User.DoesNotExist:
return JsonResponse({'message' : 'INVALID_USER'}, status=401)
로그인에 성공하면 access_token을 리턴해 줍니다.