TIL(22/11/24)

김규현·2022년 11월 24일
0

💻 Today I Learn

회원가입/탈퇴, 로그인에 이어 유저의 프로필 보기/수정 기능을 구현했다.

# install-package
pip install Pillow
pip install django-resized

django에서 filefield를 사용하기 위해서는 Pillow를 설치해야하며, ResizedImageField를 사용하기 위해 별도로 django-resized 설치도 해주어야 한다.(ImageField는 FileField에서 상속받았기 때문에 Pillow 필요)

# models.py
class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name="email address",
        max_length=255,
        unique=True,
    )
    profile_img = ResizedImageField(size=[128, 128], default="profile/default.jpeg", upload_to="profile", blank=True, force_format="JPEG")
    bio = models.TextField(max_length=500, blank=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = UserManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email
        
# views.py
class ProfileView(APIView):
    permission_classes = [permissions.IsAuthenticated]
	profile = User.objects.get(id=request.user.id)
    
    def get(self, request):
        serializer = ProfileSerializer(profile)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def put(self, request):
        serializer = ProfileUpdateSerializer(profile, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# serializers.py
class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("email", "bio", "profile_img")


class ProfileUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("bio", "profile_img")

프로필에서 보여지는 항목들은 email(계정), bio(프로필 소개), profile_img(프로필 사진)으로 정했고 profile_img의 경우 사용자가 업로드하는 파일의 size가 모두 다를 것이기 때문에 ResizedImageField를 사용하여 크기를 고정해주고, 이미지 파일 형식도 force_format을 통해 JPEG로 변환되도록 설정했다.

그리고 사용자가 업로드 한 파일 저장 공간을 구분하기 위해 upload_to로 media 디렉터리의 하위 디렉터리를 profile로 설정했다.

프로필 사진이 없을 경우 media/profile 디렉토리에 있는 default 이미지로 설정해주었고, 필수 항목이 아니기에 blank = True를 걸어주었다.

프로필 페이지는 permissions.IsAuthenticated로 설정하여 사용자 인증이 된 유저에 한하여 접근을 허용하고, request.user의 id로 User의 QuerySet을 profile이라는 변수에 담아 대상을 요청한 유저로 지정했다.

이후에 Serializer를 사용하여 유저의 정보를 가져와 프로필을 보여주고, 수정할 데이터를 입력하여 검증 및 저장 후 수정된 데이터를 반환한다.

이렇게 나의 프로필을 조회, 수정하는 API를 구현해보았고, 다른 유저의 프로필을 조회하는 API도 변수 url을 사용하여 url의 파라미터로 대상 user의 id를 받아 get 메소드에서 serializer에 넣어주면 기능을 구현할 수 있을 것 같다.

profile
웹개발 회고록

0개의 댓글