Skip to main content

Command Palette

Search for a command to run...

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

Updated
•3 min read•View as Markdown
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'

JWT 토큰 적용하기

설치 pip install djangorestframework-simplejwt

settings.py에 추가

INSTALLED_APPS = [
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

토큰의 유효시간 설정

timedelta(minutes) 조절

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)
P
Park2y ago

많이 배워요...!

More from this blog

s3사용 및 s3:PutBucketPolicy 권한 오류

1. S3 생성 중 정책 생성 페이지에서 s3:PutBucketPolicy 권한이 없어 오류 발생 IAM 사용이 아닌 루트 사용자 버전으로 설명 AWS IAM 콘솔 → 정책 → AdministratorAccess⁠검색→ 정책이 나타나면 사용자에 연결→ 없다면 새로운 정책 추가 없으므로 AdministratorAccess 생성 정책 생성 버튼 클릭 → JSON 탭 선택 후 아래 코드 입력 → 생성 { "Version": "2012-10-1...

Mar 12, 20252 min read9
s3사용 및 s3:PutBucketPolicy 권한 오류

챗봇과 사용자의 대화 내용이 길어질수록 llm 호출 시 토큰 수가 증가하여 응답 시간이 지연되는 문제가 발생

https://youtu.be/5soSQgVHGEA OpenAI API를 이용한 챗봇을 만들면서 대화가 길어질수록 LLM 호출 시 토큰 수 증가로 응답 시간이길어지는 문제가 발생 문제분석 여기서 생각하는 문제는 db 조회의 부하 처음 챗봇에게 부여하는 역할이 너무 긴데, 이걸 매 API 호출마다 전송함 대화 흐름을 기억하기 위해 챗봇-유저 간 대화 내용을 모두 DB에 저장한 다음 그대로 API 호출 마다 LLM에 전달함 → 모든 대화 ...

Jan 16, 20253 min read122
챗봇과 사용자의 대화 내용이 길어질수록 llm 호출 시 토큰 수가 증가하여 응답 시간이 지연되는 문제가 발생

dayeon's blog

124 posts