DRF - SignUp, SignIn

OneDayDev·2022년 11월 29일
0

Django

목록 보기
3/14
post-thumbnail

가입 & 로그인

Django에 있는 user 모델을 사용하기 때문에 모델은 구현할 필요가 없다

먼저, 회원 가입과 로그인 등의 기능을 모아놓을 앱을 생성하겠다.
python manage.py startapp users
앱 생성 후 settings.py에 앱 등록
토큰 인증 방식을 사용하기 위해서
'rest_framework.authtoken'도 같이 등록한다.

REST_FRAMEWORK = {
	'DEFAULT_AUTHENTICATION_CLASSES': [
    	'rest_framework.authentication.TokenAuthentication',
    ],
}

위의 변수도 추가해준다.

Serializer

from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from django.contrib.auth.password_validation import validate_password

from rest_framework import serializers
from rest_framework.authtoken.models import Token


class RegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        write_only=True,
        required=True,
        validators=[validate_password],
    )

    class Meta:
        model = User
        fields = ('username','password')

    def create(self, data):
        user = User.objects.create_user(
            username=data['username']
        )
        user.set_password(data['password'])
        user.save()
        token = Token.objects.create(user=user)
        return user

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    password = serializers.CharField(required=True, write_only=True)

    def validate(self, data):
        user = authenticate(**data)
        if user:
            token = Token.objects.get(user=user)
            return token
        raise serializers.ValidationError(
            {"error": "로그인 실패"}
        )

View

from django.contrib.auth.models import User
from rest_framework import generics, status
from rest_framework.response import Response

from .serializers import *


class RegisterView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = RegisterSerializer


class LoginView(generics.GenericAPIView):
    serializer_class = LoginSerializer

    def post(self, request):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        token = serializer.validated_data
        return Response({"token": token.key}, status=status.HTTP_200_OK)

URL

from django.urls import path
from .views import *

urlpatterns = [
    path('register/', RegisterView.as_view()),
    path('login/', LoginView.as_view()),
]
profile
안녕하세요. Django 백엔드 개발하고 있습니다.

0개의 댓글