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¶m2=value2)
# 크기 제한: 대부분의 웹 브라우저와 웹 서버는 URL의 길이에 제한이 있으므로 크기가 큰 데이터를 전송하는 데에는 적합하지 않습니다.
# 보안: 데이터가 URL에 포함되어 있기 때문에 비밀번호나 기타 중요한 정보를 전송하는 데 사용되어서는 안 됩니다.
# 캐싱: 일반적으로 웹 브라우저에 의해 캐싱될 수 있습니다.
# HTTP POST:
# 목적: 서버로 데이터를 전송하기 위해 사용됩니다.
# 이 데이터는 새로운 리소스를 생성하거나 기존 리소스를 업데이트하기 위한 것일 수 있습니다.
# 데이터 전송: 데이터는 HTTP 메시지의 본문에 포함되어 전송됩니다. 따라서 큰 데이터를 전송하는 데에 적합합니다.
# 크기 제한: 본문의 크기에 따라 웹 서버 설정에 따라 제한이 있을 수는 있지만,
# 일반적으로 GET보다 큰 데이터를 전송하는 데 더 적합합니다.
# 보안: 데이터가 HTTP 메시지 본문에 포함되어 있으므로 URL에 노출되지 않습니다.
# 그러나 전송된 데이터는 여전히 암호화되지 않을 수 있으므로 중요한 정보를 전송할 때는 HTTPS와 같은 보안 프로토콜을 사용해야 합니다.
# 캐싱: 일반적으로 캐싱되지 않습니다.
# 이런 차이점들을 기반으로, GET은 정보를 조회할 때 주로 사용되며, POST는 서버에 정보를 제출할 때 주로 사용됩니다.
# 그러나 POST 요청의 응답으로 서버가 데이터를 반환하는 것도 가능합니다.
# 예를 들어, 새로운 리소스를 생성한 후 해당 리소스의 세부 정보를 반환할 수 있습니다.
# 즉, POST를 사용하여 데이터를 서버에 보내면서 동시에 서버로부터 정보를 받아올 수 있습니다. :: 주고받음의 역할
# 하지만 GET이 데이터를 조회하는 데 더 일반적으로 사용된다는 점을 이해하는 것이 중요합니다.