회원가입/탈퇴, 로그인에 이어 유저의 프로필 보기/수정 기능을 구현했다.
# 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에 넣어주면 기능을 구현할 수 있을 것 같다.