drf를 사용해 회원가입, 로그인, 로그아웃 기능 구현해보기

accounts models.py에 작성
AUTH_USER_MODEL 설정은 반드시 프로젝트 최초 마이그레이션에서 함께 진행
⇒ 기본 유저를 변경하지 않더라도 확장성을 위해 Custom User Model을 작성
User Model 정의하기
accounts/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
settings.py
AUTH_USER_MODEL = 'accounts.User'
설치 pip install djangorestframework-simplejwt
settings.py에 추가
INSTALLED_APPS = [
'rest_framework_simplejwt',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
settings.py
from datetime import timedelta
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=3),
"REFRESH_TOKEN_LIFETIME": timedelta(days=1),
"ROTATE_REFRESH_TOKENS": True,
"BLACKLIST_AFTER_ROTATION": True,
}
User Model 정의하기
accounts 회원가입에 필요한것-username(닉네임 포함), 비밀번호, 이메일, 이름, 닉네임, 생일, 성별
models.py
class User(AbstractUser):의 AbstractUser에 username, email 등이 있기 때문에 생일과 성별만 지정해주면 될것 같다. gender의 choices가 헷갈려서 공식문서를 보며 작성했다.
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core.validators import MinValueValidator, MaxValueValidator
from datetime import date
class User(AbstractUser):
class Gender_Choices(models.TextChoices):
Male = 'M', '남성'
Female = 'F', '여성'
Other = 'O', '중성'
birthday = models.DateField(
validators=[
MinValueValidator(date(1900, 1, 1)),
MaxValueValidator(date.today())
]
)
gender = models.CharField(max_length=1, choices=Gender_Choices.choices)
login, logout, signup 정의하기
로그인, 로그아웃 기능에서 고민을 많이 했다.
method가 둘 다 POST라서 아래의 방법으로 한번에 묶은 다음에
if문으로 로그인, 로그아웃을 할까 고민을 했는데,
# 로그인, 로그아웃
class AuthAPIView(APIView):
def post(self, requers):
pass
로그인, 로그아웃을 각각의 CBV로 작성하기로 했다.
# 로그인
class LoginAPIView(APIView):
def post(self, requers):
pass
# 로그아웃
class LogoutAPIView(APIView):
def post(self, request):
pass
drf로 회원가입
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core.validators import MinValueValidator, MaxValueValidator
from datetime import date
class User(AbstractUser):
class Gender_Choices(models.TextChoices):
Male = 'M', '남성'
Female = 'F', '여성'
Other = 'O', '중성'
birthday = models.DateField(
validators=[
MinValueValidator(date(1900, 1, 1)),
MaxValueValidator(date.today())
]
)
gender = models.CharField(max_length=1, choices=Gender_Choices.choices)
serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
def create(self, validated_data):
user = User.objects.create_user(
username=validated_data['username'],
email=validated_data['email'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
birthday=validated_data['birthday'],
gender=validated_data['gender'],
password=validated_data['password']
)
return user
views.py
class RegisterAPIView(APIView):
def post(self, request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
if user:
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def get(self, request):
data = {'gender':{'M':'남성', 'F':'여성', 'O':'중성'}}
return Response(data)
POSTMAN

같은 아이디로 한번 더 회원가입 할 시

회원가입 성별 작성법 예시

로그인

프로필 조회

로그인
# 로그인
class LoginAPIView(APIView):
def post(self, request):
data = request.data
user = authenticate(**request.data)
if not user:
return Response({'message':'응다시해'}, status=404)
refresh_token = TokenObtainPairSerializer.get_token(user=user)
data = {'user': user.id,
'access_token': str(refresh_token.access_token),
'refresh_token': str(refresh_token)}
return Response(data)
로그아웃
# 로그아웃
class LogoutAPIView(APIView):
def post(self, request):
logout(request)
return Response({'message': '만나서 반가웠읍니다..'}, status=status.HTTP_200_OK)
프로필
# 프로필 조회
class ProfileView(APIView):
def get(self, request, username):
user = get_object_or_404(User, username=username)
serializer = UserSerializer(user)
return Response(serializer.data)




