또한, 요즘 서비스에서 소셜 인증을 안 쓸 수 없기 때문에 추후에 소셜 인증으로 해당 포스트를 그대로 다시 작성해보겠습니다.
django-rest-knox?
우리가 앞서 설치한 패키지인 django-rest-knox는 사용자 당 여러 개의 토큰을 지원하고 여러 보안 기술을 제공합니다. 앞서 설정했던 것처럼 settings.py의 INSTALLED_APPS에 knox를 넣어주셨다면, 아래 내용을 settings.py에 추가해야 합니다.
defvalidate(self, data): user = authenticate(**data) if user and user.is_active: return user raise serializers.ValidationError("Unable to log in with provided credentials.")
다른 시리얼라이저는 다 ModelSerializer로 작성하여 간단하게 처리하였고, 로그인의 경우 연결되는 모델이 없기 때문에 그냥 Serializer로 작성하였습니다.
# api/views.py from rest_framework import viewsets, permissions, generics, status from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.decorators import api_view from knox.models import AuthToken from .serializers import CreateUserSerializer, UserSerializer, LoginUserSerializer
# Create your views here. @api_view(["GET"]) defHelloAPI(request): return Response("hello world!")
이번 뷰는 generic 기반 클래스 뷰로 작성되었습니다. 우선 함수 기반 뷰에서 클래스 기반 뷰로 바뀌면서 수정된 점은 앞서 데코레이터로 미리 http 메소드를 정의해주었던 것을 클래스 안으로 넣었다는 것이 있습니다. 또한 제네릭 뷰의 경우에는 기본적인 기능을 모두 포함하는 뷰로, 자세한 설명은 추후에 첨부하겠습니다.
url 설정
마지막으로 url을 설정하면 완료됩니다.
1 2 3 4 5 6 7 8 9 10
# api/urls.py from django.urls import path, include from .views import HelloAPI, RegistrationAPI, LoginAPI, UserAPI
# Create your models here. from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver
classProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) user_pk = models.IntegerField(blank=True) email = models.EmailField(max_length=500, blank=True) nickname = models.CharField(max_length=200, blank=True) point = models.IntegerField(default=0) like = models.CharField(max_length=200, blank=True) phone = models.CharField(max_length=200, blank=True)
@receiver(post_save, sender=User) defcreate_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance, user_pk=instance.id)
여기서 @receiver로 작성된 함수들은 User 모델로부터 post_save라는 신호, 즉 User 모델 인스턴스 생성에 맞춰 Profile 모델 인스턴스 또한 함께 생성하라는 것입니다. 이로 인해 여러분이 처음 유/저를 생성하고 username과 password만 입력해도 해당 사용자에 대한 Profile 인스턴스가 함께 생성 됩니다.
Profile Serializer 생성
다음은 Profile 모델에 대한 시리얼라이저를 만들어보겠습니다. 기본적으로 프로필 정보 조회에 필요한 프로필 ModelSerializer가 필요합니다.
Django의 어드민 페이지에서 Profile 모델의 데이터를 보고 싶다면 admin.py에 등록해야 합니다. 또한 Profile 모델은 User 모델에 종속되어 있는 상황으로 User 인스턴스에 Profile 인스턴스가 포함되어 있는 형태로 보기 위해 다음과 같이 코드를 작성하여 등록합니다.
# Register your models here. from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import User from .models import Profile
classProfileInline(admin.StackedInline): model = Profile can_delete = False verbose_name_plural = "profile"
이제 모든 개발을 마쳤으니 Profile 기능을 확인할 차례입니다. Insomnia를 활용하여 테스트 해보겠습니다.
Django에서 update 기능을 사용할 때는 PUT 메소드로 요청을 보내야 합니다.
- User 생성 요청
- Profile 수정 요청
이제 어드민 페이지에서 확인해보겠습니다.
위처럼 superuser 외에 생성한 testuser1이 보이며,
이렇게 나오며 프로필 수정 또한 잘 된 것을 확인할 수 있습니다.
마치며
여태까지 회원 가입 / 로그인 관련 API를 작성하였습니다. 사실 이렇게 하면 백엔드에서 할 역할은 얼추 끝이지만, 실제 웹 사이트를 만들어보지 않으면 이게 어떻게 되는지 이해할 수 없기 때문에 다음 시간에는 번외편으로 아주아주 간단한 프론트를 만들어서 실제로 회원가입하고 로그인하는 것을 구현해보겠습니다.