장고에서는 DB 연동시 자동으로 회원가입에 사용할 수 있는 Auth_User테이블이 생성된다.
models.py에 AuthUser를 가져온 후 사용하기 위해 간단히 설정을 해줘야한다.
# models.py
class AuthUser(models.Model):
password = models.CharField(max_length=128)
last_login = models.DateTimeField(blank=True, null=True)
is_superuser = models.IntegerField(default=False) # default 설정
username = models.CharField(unique=True, max_length=150)
first_name = models.CharField(max_length=150)
last_name = models.CharField(max_length=150)
email = models.CharField(max_length=254)
is_staff = models.IntegerField(default=0) # default 설정
is_active = models.IntegerField(default=0) # default 설정
date_joined = models.DateTimeField(auto_now_add = True) # 날짜 자동 입력
class Meta:
managed = False
db_table = 'auth_user'
바로 기본값(default) 설정이다.
기본값을 설정하지 않을 경우 Null값이 허용되지 않은 열들이 있어 에러가 발생한다.
is_superuser, is_staff, is_active 값을 default로 0 혹은 False로 설정한다.
이후 date_joined는 auto_now_add를 True로 주어 데이터 입력시 값이 자동으로 입력되게 해준다.
# serializers.py
class AuthUserSerializer(serializers.ModelSerializer):
class Meta:
model = AuthUser
fields = ('id', 'username', 'password')
# views.py
@api_view(['POST'])
def signup(request):
if request.method == 'POST':
serializer = AuthUserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'message': '회원 가입이 완료되었습니다.'}, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
간단히 POST를 받아와 회원가입을 할 수 있다.
이후 JSON형식으로 username과 password를 설정한다.
{
"username":"username",
"password":"password"
}
MySQL에서 DB를 확인해보면 아래와 같이 입력되어 있는 것을 볼 수 있다.
하지만 보안을 위해 password는 암호화하여 DB에 저장할 수 있도록 해주는 것이 좋다.
make_password
: Django에서 제공하는 함수로 문자열을 암호화 시킨다.
# models.py
from django.contrib.auth.hashers import make_password
@api_view(['POST'])
def signup(request):
if request.method == 'POST':
serializer = AuthUserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
# Serializer에서 입력받은 원시 비밀번호를 가져온다.
raw_password = serializer.validated_data.get('password')
# make_password 함수를 사용하여 비밀번호를 해시화하고 저장한다.
hashed_password = make_password(raw_password)
serializer.save(password=hashed_password)
return Response({'message': '회원 가입이 완료되었습니다.'}, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
위와 같이 코드를 수정 후 저장하면 비밀번호가 암호화 되어 들어간 것을 확인할 수 있다.