학습 주제
POST 기능 구현
학습 내용
question_list를 활용해서 GET이 아닌 POST 구현
POST는 무언갈 만드는 작업이기 때문에, question을 만드는 작업이 될 예정.
이전 시간 @api_view()
에 아무것도 넣어주지 않으면 자동으로 GET
이 된다고 했다. POST
를 명시하기 위해선 안에 값을 넣어주어야 한다.
@api_view(['GET', 'POST'])
이제 API 데코레이터를 통해서 POST
도 처리한다는 것을 명시하였다.
현재는 모든 퀘스쳔들을 내려주는 역할만 있는데, request에 따라서 그 처리를 다르게 해보려고 한다.
이렇게 request.method == 'GET'
일 때와 request.method == 'POST'
일 때로 나누어 동작하게 한다.
serializer
를 이용해서 데이터를 받아들이고, 그 받아들인 데이터를 이용해서 저장을 하려고 한다.
serializer = Questionserializer(data=request.data)
인스턴스가 주어지지 않고 데이터만 주어졌으므로, serializer
는 이를 생성으로 인식한다. 그리고 request.data
에는 request.method == 'POST'
이므로 question에 대한 정보가 들어와 있을 것이다. {'question_text':'예시입니다.'}
그 이후
serializer.is_valid()
serializer.save()
장고 쉘에서 했듯, 생성 후에는 is_valid()를 수행해야 save가 가능하다.(True, False여부 관계 없음) .save()
를 하면 바로 DB에 저장된다. 따라서 우리는 굳이 정합성 테스트에 실패한 데이터를 저장할 필요는 없다. if 문으로 나누면
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
브라우저로 넘어와서
POST가 새롭게 반영된 것을 볼 수 있다.
POST를 사용하기 위해서 OPTIONS를 누르고
Content에 내용을 입력하고 POST를 누르면 된다.
실제로 어떻게 동작하는지 보기 위해 개발자 도구 - 네트워크를 켠다.
주의: JSON형식은 ""로 넣어줘야함. ''안됨.
Content가 곧 request의 데이터로 주어지게 될 것이다. 이걸 시리얼라이저에 그대로 전달해서 저장될 것이다.
강의는 이름이 question/인데 나는 ?format=api 로 나왔다.
다시 보내보니까 이번엔 정상적으로 question/에 request를 POST로 날렸다. 페이로드를 보면 우리가 무엇을 저장했는지 나온다.
serializer.errors
가 어떻게 쓰였는지 알아본다.
비어있는 JSON을 전달해본다
question이 만들어지지 않은 것 같다.
에러메세지도 정상적으로 출력되는 것을 확인할 수 있다. 그러나 여기서 응답을 보면
에러 메세지를 받았으나 응답을 받은 것을 볼 수 있다. 코드에서 이를 구현해보기로 한다.
vs code로 이동해서
request에도 method가 있는 것처럼 응답에도 status라는 것이 있다. 그 처리 결과는 http의 status로 응답해준다. http의 status가 200대라면 정상적으로 수행되었다는 의미. 400대라면 뭔가 잘못됐다는 의미.
from rest_framework import status
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
추가로, 정상적으로 수행된 경우에도 200이 내려가나 여기에도, 그냥 200이 아닌 생성이 되었다는 명확한 status를 주기로 한다.
다양한 상태가 표시된다. 200도 맞긴 하나, 좀더 구체적인 응답을 내려주기 위해 201을 채택.
return Response(serializer.data, status=status.HTTP_201_CREATED)
다시 긴 제목을 적고 POST를 누르면 이번에는 빨간색으로 표시되는 것을 확인할 수 있다.
메세지는 동일. status -> 400 BAD Request
정상 post
201 Created 코드가 내려왔다.
status는 그 외에 다양한 코드를 갖고 있다. 400대 에러는 일전에 get_object_or_404
로 500대 에러가 아닌 404 에러로 정확하게 내리게 했었다.
지난 시간에 request.data는 파이썬 딕셔너리 형식이 아니고, JSON형식이라고 하지 않았었나? 헷갈린다.