회원가입

  • 시리얼라이즈 fields로 Users 모델의 필드를 전부 가져온다.
  • 시리얼라이즈 생성시 비밀번호가 노출되지 않도록 해싱한다.

 

(app-urls.py)

from users import views

urlpatterns = [
    path('signup/', views.UserView.as_view(), name='user_view'),
    ]

 

(app-views.py)

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from users.serializers import UserSerializer


class UserView(APIView):
    def post(self, request):
        serialize = UserSerializer(data=request.data)
        if serialize.is_valid():
            serialize.save()
            return Response({'message':'가입완료'}, status=status.HTTP_201_CREATED)
        else:
            return Response({'message':f'${serialize.errors}'}, status=status.HTTP_400_BAD_REQUEST)

 

(app-serializers.py)

from rest_framework import serializers
from user.models import Users


class UserSerialize (serializers.ModelSerializer):
    class Meta:
        model = Users
        fields = '__all__'

    def create(self, validated_data):
        user = super().create(validated_data)
        password = user.password
        user.set_password(password)
        user.save()
        return user

 

 

 

 

회원 수정, 삭제

  • 특정 회원 정보가 필요하므로 url을 통해 유저의 id를 전송한다.
  • 로그인한 유저와 전송된 유저의 id가 동일할 때 수정, 삭제한다.
  • 이메일 수정 요청을 해도 로그인한 유저의 이메일로 되돌려보낸다. (이메일 고정)
  • 업데이트 할 때도 비번을 해싱하여 저장한다.

(app - urls.py)

urlpatterns = [
    path('<int:user_id>/', views.UserDetailView.as_view(), name='user_detail_view'),
]

 

(app - views.py)

from user.models import Users


class UserDetailView(APIView):
    def delete(self, request, user_id):
        compare_user = get_object_or_404(Users, id=user_id)
        if request.user == compare_user:
            compare_user.delete()
            return Response('회원 탈퇴.', status=status.HTTP_204_NO_CONTENT)
        else:
            return Response('삭제 못함', status=status.HTTP_403_FORBIDDEN)
        
    def put(self, request, user_id):
        compare_user = get_object_or_404(Users, id=user_id)
        if request.user == compare_user:
            serialize = UserSerialize(compare_user, data=request.data)
            if serialize.is_valid():
                serialize.email=request.user.email,
                serialize.save()
            return Response('회원 수정', status=status.HTTP_200_OK)
        else:
            return Response('수정 못함', status=status.HTTP_403_FORBIDDEN)

 

(app - serializers.py)

# 추가하기
class UserSerialize (serializers.ModelSerializer):
    # 이메일을 아이디 값으로 취급
    # 비번은 해싱
    def update(self, instance, validated_data):
        password = validated_data.get('password', instance.password)
        instance.set_password(password)
        instance.bio = validated_data.get('bio', instance.bio)
        instance.name = validated_data.get('name', instance.name)
        instance.age = validated_data.get('age', instance.age)
        instance.gender = validated_data.get('gender', instance.gender)
        instance.save()
        return instance

 

'Python > Django' 카테고리의 다른 글

[DRF] 08.5 토큰 주기설정, permission  (0) 2023.04.26
[DRF] 08. Payload 커스텀  (0) 2023.04.26
[DRF] 06.5 admin 커스텀  (0) 2023.04.25
[DRF] 06. User / UserManager  (0) 2023.04.24
[DRF] 05. 기본 JWT 토큰  (0) 2023.04.24

+ Recent posts