회원가입
- 시리얼라이즈 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 |