장고에서 serializer 를 사용해 회원가입 / 탈퇴 기능을 구현해 보자.
각 코드에 대한 해설은 주석으로 확인 할 수 있다.
url와 model은 이미 만들었다고 가정하고 그 다음 작업들을 해 보도록 하자
views.py에서 회원가입을 작성해보자
# views.py
class UserView(APIView):
# 회원가입
def post(self, request):
# user_serializer 안에 Serializers.py의 UserSerializer의 request.data를 가져온다.
user_serializer = UserSerializer(data=request.data)
# 가져온 데이터의 is_valid 에 raise_exception=True 를 넣어주어 데이터가 유효한지
# 검사해주고 유효하지 않다면 bad request 에러를 보내준다
if user_serializer.is_valid(raise_exception=True):
# 유효한 경우 저장하고 "messages"를 보내준다.
user_serializer.save()
return Response({"messages" : "가입 성공"})
else:
print(serializers.errors)
return Response({"messages" : "가입 실패"})
views.py에서 로그인 기능을 만들어 보자
# views.py
# 로그인 기능을 쉽게 구현해주는 import
from django.contrib.auth import login, authenticate
class UserApiView(APIView):
# 로그인
def post(self, request):
#username, password를 가져온다
username = request.data.get('username', '')
password = request.data.get('password', '')
# authenticatesms() 는 장고에서 제공하는 인증 함수이다.
# username, password가 유효한지 확인해 준다.
user = authenticate(request, username=username, password=password)
if not user:
return Response({"error": "존재하지 않는 계정이거나 패스워드가 일치하지 않습니다."}, status=status.HTTP_401_UNAUTHORIZED)
login(request, user)
return Response({"message": "로그인 성공!!"}, status=status.HTTP_200_OK)
serializers.py 를 작성해 보자.
# serializers.py
from rest_framework import serializers
# User model을 import 해준다.
from user.models import User as UserModel
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = UserModel
fields = ["fullname", "username", "password"]
def create(self, validated_data):
# pop 을 사용하면 password를 삭제하고 즉시 다시 생성해준다.
# 헤싱이 되지 않은 비밀번호를 삭제하고 헤싱을 시켜 다시 저장해주기 위해 사용된다.
password = validated_data.pop("password", None)
user = UserModel(**validated_data)
# set_password() 를 사용해 헤싱을 해준다.
user.set_password(password)
# 저장
user.save()
return user
댓글