DRF: serializer 사용 - login/signup

권수민·2023년 10월 11일
0
from rest_framework.views import APIView
from rest_framework import status,permissions
from rest_framework_simplejwt.views import (
    TokenObtainPairView
)
from users.serializers import UserSerializer,CustomTokenObtainPairSerializer
from rest_framework.response import Response

# Create your views here.

class UserView(APIView):
    def post(self, request):
        # serializer = UserSerializer (data=request. data)
        # serializer.is_valid(raise_exception=True)
        # serializer.save()
        #밑에것과 다를것 없지만 따로 조건문을 넣어주면 유도리 있게 그 사이에 더 필용한 작업들을 실행할 수 있다.
        serializer = UserSerializer(data = request.data) 
        # db상에는 저장이 아직되어있지 않지
        # request.data는 브라우저에서 받아온 body값 json형태로 받아온 데이터를 가지고있다.
        # 여기서 request로 받아와 지면서  drf에 의해 python 딕셔너리상태로 변형되어가져오게된다.
        # 즉,JSON으로 받아져오잖아? json.stringfy → 이걸 Python 사전(dict) 바꿔줘서 서버에 넘기고 → 다시 JSON으로의 변환과정, 그리고 그 사이에 여러 유효성 검사와 처리
        # serializer를 통해 json 직렬화 시키는 것 뿐만아니라 여러 역할을 수행한다.
        
        ##즉, api는 클라이언트->서버 그리고 서버-> 클라이언트 두가지 방향을 다 컨트롤하는 곳이기에
        # 클라이언트->서버 (디코딩)
        #현재는 post로 프론트에서 받아온 body부분의 json을 -> python객체로 서버에서 디코딩화 시켜는데,
        # DRF에서는 서버에서 이 디코딩 과정이 자동으로 처리해주고, request.data에는 파이썬 딕셔너리 형태의 데이터가 저장된다는 말.
        
        #서버-> 클라이언트 (인코딩)
        # 그렇게 서버가 처리한 결과를 클라이언트에게 보낼 때, 해당 결과는 JSON 형식의 문자열로 변환 (인코딩) 해서 전송됩니다.
        # 이 인코딩 과정 역시 Django REST framework의 Serializer를 통해 수행될 수 있습니다. 
        # Serializer의 .data를 응답으로 전송하면, 그 데이터는 JSON 형식으로 클라이언트에게 전달됩니다.
        
        
# Serializer의 주요 역할은 다음과 같습니다:
# 데이터 유효성 검사 (Validation): 받아온 데이터가 우리의 기대와 일치하는지, 
# 예를 들어 필수 필드의 존재, 데이터 형식, 길이 제한 등의 유효성을 검사합니다.

# 복잡한 데이터 구조의 처리: ORM의 관계 (예: ForeignKey, ManyToMany)를 쉽게 JSON과 같은 형태로 표현하거나, 
# 반대로 복잡한 JSON 데이터를 ORM 객체로 변환하는 작업을 돕습니다.

# ORM과의 연계: 파이썬 사전 형태로 파싱된 데이터를 모델의 인스턴스로 변환하거나, 
# 반대로 모델의 인스턴스나 쿼리셋을 JSON 형태로 변환하는 작업을 수행합니다.




        if serializer.is_valid():
            serializer.save()
            #이렇게 해서는 비번 해싱이 안됌.
            return Response({"message": "가입완료"},status=status.HTTP_201_CREATED)
        else: 
            return Response({"message": f"{serializer.errors}"}, status=status.HTTP_400_BAD_REQUEST)
        
class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer
    #drf에서 사용하는 serializer클라스를 지정하기위한 클래스 변수이다.
    #클래스 변수는 그 클래스의 (만들어진 무수한)인스턴스들이 공유하는 변수 
    # CustomTokenObtainPairSerializer 클라스로 들어가면 Return값이 있기 떄문에 따로 필요가 없음
    # TokenObtainPairView안에보면 다 serialize_class변수 라던지 post요청이 있다.
    # payload부분에 추가적인 데이터를 넣어준는것.
    
#get요청 토큰인증확인
class mockView(APIView):
    permission_classes=[permissions.IsAuthenticated]#인증된사용자만 뷰에 접근(api)
    #permissions.안에 내장된 기존 메소드들이 있고 현재는 인증이 유효한지에 관련한 클라스 메소드를 불러들이고 있다.
    def get(self, request):
        print(request.user)
        #이부분은 포스트로보내는게 맞는데 일단 확인차 테스팅하기위해 겟에 넣어준것뿐임
        #그래도 반영이 되어서 디비들어가서 보면 요청이 변경된것을 볼 수 있다. 
        user = request.user
        user.is_admin = True # true로 변경
        user.save()
        #
        return Response("get요청")
    #이때 포스트맨으로 체크하는데 로긴하고 나서의 토큰이 잘 갔는지 테스팅을 해주는거라 
    # 헤더에 실어서 보낼꺼라 헤더부분에 키 Authorization 값 Bearer accesstokennumber해줘야한다 bearer는 들고있는 사람
    # 왜냐하면 요청시 header에 토큰정보를 담아 넣어줘야 그값이 확인하고 인증하기때문에  
    
    # 포스트맨에서는 위와같이했다면 이제 frontend에서 자바스크립트로 fetch api써서 보내줄것.
    
    
    
    
    # =====================================================================================


# HTTP GET:
    
#     목적: 주로 서버로부터 정보를 검색하기 위해 사용됩니다.
#     데이터 전송: 데이터는 URL의 쿼리 매개변수로 전송됩니다. 
#             (예: https://example.com/data?param1=value1&param2=value2)
#     크기 제한: 대부분의 웹 브라우저와 웹 서버는 URL의 길이에 제한이 있으므로 크기가 큰 데이터를 전송하는 데에는 적합하지 않습니다.
#     보안: 데이터가 URL에 포함되어 있기 때문에 비밀번호나 기타 중요한 정보를 전송하는 데 사용되어서는 안 됩니다.
#     캐싱: 일반적으로 웹 브라우저에 의해 캐싱될 수 있습니다.



# HTTP POST:
    
#     목적: 서버로 데이터를 전송하기 위해 사용됩니다.
#             이 데이터는 새로운 리소스를 생성하거나 기존 리소스를 업데이트하기 위한 것일 수 있습니다.
#     데이터 전송: 데이터는 HTTP 메시지의 본문에 포함되어 전송됩니다. 따라서 큰 데이터를 전송하는 데에 적합합니다.
#     크기 제한: 본문의 크기에 따라 웹 서버 설정에 따라 제한이 있을 수는 있지만, 
#                 일반적으로 GET보다 큰 데이터를 전송하는 데 더 적합합니다.
#     보안: 데이터가 HTTP 메시지 본문에 포함되어 있으므로 URL에 노출되지 않습니다. 
#             그러나 전송된 데이터는 여전히 암호화되지 않을 수 있으므로 중요한 정보를 전송할 때는 HTTPS와 같은 보안 프로토콜을 사용해야 합니다.
#     캐싱: 일반적으로 캐싱되지 않습니다.
#     이런 차이점들을 기반으로, GET은 정보를 조회할 때 주로 사용되며, POST는 서버에 정보를 제출할 때 주로 사용됩니다.
#     그러나 POST 요청의 응답으로 서버가 데이터를 반환하는 것도 가능합니다.
#     예를 들어, 새로운 리소스를 생성한 후 해당 리소스의 세부 정보를 반환할 수 있습니다.

# 즉, POST를 사용하여 데이터를 서버에 보내면서 동시에 서버로부터 정보를 받아올 수 있습니다. ::  주고받음의 역할
# 하지만 GET이 데이터를 조회하는 데 더 일반적으로 사용된다는 점을 이해하는 것이 중요합니다.
profile
초보개발자

0개의 댓글