Django에 있는 user 모델을 사용하기 때문에 모델은 구현할 필요가 없다
먼저, 회원 가입과 로그인 등의 기능을 모아놓을 앱을 생성하겠다.
python manage.py startapp users
앱 생성 후 settings.py에 앱 등록
토큰 인증 방식을 사용하기 위해서
'rest_framework.authtoken'도 같이 등록한다.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
}
위의 변수도 추가해준다.
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": "로그인 실패"}
)
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)
from django.urls import path
from .views import *
urlpatterns = [
path('register/', RegisterView.as_view()),
path('login/', LoginView.as_view()),
]