from rest_framework import permissions, status
from rest_framework.response import Response
from drf_yasg.utils import swagger_auto_schema
class ChangeProfileImgView(APIView):
"""
프로필 이미지 변경
---
"""
permission_classes = (permissions.IsAuthenticated,)
@swagger_auto_schema(
request_body=MemeberProfileImgChangeSerializer,
responses={200: MemberSerializer},
)
def post(self, request):
serializer = MemeberProfileImgChangeSerializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
profile_img = serializer.validated_data["profile_img"]
member = request.user
member.profile_img = profile_img
member.save()
res = MemberSerializer(member).data
return Response(res)
apps -> member -> serializers.py에 적혀있는 일반 직렬 변환기로 작성되어 있다. 이렇게 Member의 필드 일부분에 해당하는 serializer를 작성해줌으로써 POST 요청을 보낼 때 특정 model의 특정 field를 수정할 수 있다.
해당 serializer의 생김새는 아래와 같다.
class MemeberProfileImgChangeSerializer(serializers.Serializer):
profile_img = serializers.CharField(
max_length=500, allow_blank=True, allow_null=True
)
swagger에서 request_body부문에 작성된 serializer가 swagger 페이지에서 어디에 나타나는지 보자.
@swagger_auto_schema(
request_body=MemeberProfileImgChangeSerializer,
responses={200: MemberSerializer},
)
request_body 인자의 값으로 POST api에 해당하는 serializer를 넣을 경우 DB 인스턴스에 수정하고자 할 때 보내는 데이터에 형태를 swagger 문서에 표시해준다.
responses의 경우 해당 api가 정상 작동 되었을 때 딕셔너리 형태로 들어간다 응답 상태코드를 키
로 serilizer를 값
으로 넣을 경우 swagger 페이지에서 어떻게 응답 받는지에 대한 상세 내용을 알려준다. 해당 내용은 해당글에서 한번 언급해서 생략
먼저 위의 API는 모델 Member에 적혀있는 필드 값을 변경하는 작업이다. 필드의 경우 Model Member의 특정 필드에 해당한다.
AWS S3에 저장된 이미지 링크가 해당 필드에 해당하고 문자열 형태로 저장된다.
여기서 한가지, app Memeber(models.py) 내 다른 모델들과는 다르게 AbstractBaseUser를 상속받고 있는데 models.Model이 아닌 해당 클래스를 상속 받아서 사용하는 이유는 Django 로그인 절차가 아닌 인증 절차를 직접 구현하고자 할 때 해당 객체를 상속 받는다.
class Member(AbstractBaseUser):
...
profile_img = models.CharField(
max_length=500, blank=True, null=True,
verbose_name="프로필 이미지 URL"
)
...
objects = Membermanager()
해당 부문을 설정함으로써 일반 유저 및 슈퍼유저의 생성 방식을 정의해 주는 것이다.
²USERNAME_FIELD에 Member의 필드를 설정해줌으로써 로그인 시 어떤 필드를 아이디로 할 지 정해주어야 한다.
USERNAME_FIELD = "id"
REQUIRED_FIELDS = ["hand_phone", "activate", "name"]
model 작성 완료 후 해당 모델을 Django Admin에서 사용하길 원한다면 admin.py에 등록 작업을 해주어야 한다.
인증을 위한 유저 모델로 사용하기 위해선 settings.py에 등록해 주어야한다.
일반적으로 serializer에 인자를 넘기서 사용하는 방법에 3가지 경우가 있다. ¹인스턴스, ²데이터, ³인스턴스+데이터 이렇게이다.
serialzer.validated_data는 프로퍼티이다. self._validated_data를 반환하는데 self.run_validation(self.inital_data)의 반환 값으로 유효성 데이터를 통과한 값들이다. 따라서 유효성을 통과한 값들 중 특정 필드에 접근하여 값을 가지고 오는 과정이다.
profile_img = serializer.validated_data["profile_img"]
해당 과정 후에 serializer.save() 시 값이 저장되게 된다.