인프런 커뮤니티 질문&답변

tprpek님의 프로필 이미지

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

쇼핑몰 장바구니 api 를 만들던중 오류

22.11.17 16:50 작성

·

552

0

안녕하세요 ! 선생님 수업 잘듣고 현재 쇼핑몰 만드는 프로젝트를 해보고 있는데

쇼핑몰 장바구니 api가 계속 오류가 뜨는데 이유를 잘 모르겠습니다 ㅠ

K-005.png장바구니 모델입니다.

K-006.png유저 모델입니다.K-007.png제품 모델입니다.

K-001.pngK-002.pngK-003.pngK-004.png장바구니의 views.py 입니다!

K-008.png오류 장면입니다.

몇일째 못고치고있는데 원인과 그 해결방법을 알려주시면 감사하겠습니다ㅠㅠ

답변 2

0

이진석님의 프로필 이미지
이진석
지식공유자

2022. 11. 17. 20:42

DRF를 안 쓰신다면 JsonResponse가 유용하실 수 있겠구요.
JsonResponse는 단순히 HttpResponse에 json.dumps 기능을 얹은 것 뿐입니다.

DRF의 Response를 활용하셔야 APIView의 renderers 기능을 활용하실 수 있게 있으며, json.dumps보다 강력한 json 직렬화 기능을 제공해주고 있습니다.

그리고 DRF에서는 request.data 속성을 추가로 지원해줍니다. application/json 요청일 경우 json.loads를 자동으로 처리해주구요.
그러니 APIView를 쓰실 때에는 굳이 직접 json.loads를 하실 필요가 없습니다.

오류의 코드를 안 보여주시고 에러만 일부 보여주시니 원인을 알기 어렵습니다만
json.loads 에서는 인자로 문자열이 주어져야 json 디코딩을 수행하는 데
dict 타입 객체가 지정되어 ValueError가 발생하는 것입니다.

혹시 json.loads(request.data) 코드를 수행하신 것은 아닌가요?
request.data는 문자열이 아니라 object입니다.

차근차근 확인해보시고, 질문 만으로 맥락을 파악할 수 있도록 좀 더 공들여서 질문 부탁드립니다. 그럼 보다 정확한 답변을 얻으실 수 있습니다.

화이팅입니다. :-)

tprpek님의 프로필 이미지
tprpek
질문자

2022. 11. 17. 23:43

죄송합니다 ㅠㅠ 코드를 캡쳐를 해놓고 덧붙이는걸 깜빡했네요
json.lodas(request.data)를 수행하고있었습니다!

그래서 현재 이러한 상태로 코드들을 수정해보았고 그결과 장바구니가 생성되는것까지 db에서 확인하였습니다!

하지만 get으로 장바구니 데이터를 확인하려고 했을때 현재 이러한 오류가 뜨고있습니다

제 생각으론 product.image가 원인인거 같은데 이 원인이 맞는지 또한 해결방법이 무엇이 있을지 궁금합니다!

imageimage

image

image

image

delete 부분또한 이렇게 수정해보았는데 image이 화면에서 delete를 누를시 invalid_cart 오류가 떠서

코드에서 제가 직접 cart_id 를 해당 int id 값으로 넣어줬을때는삭제가 잘되는것을 볼 수 있었습니다.

이 경우 코드에 문제가 없는지 궁금합니다!

 

이진석님의 프로필 이미지
이진석
지식공유자

2022. 11. 19. 23:43

IDE의 디버거 기능을 활용하시어, 각 코드가 수행될 때의 참조하는 값들을 하나하나 확인해보시면, 디버깅이 보다 수월해집니다. // 그렇지않다면 계속 상상만 할 뿐이거든요. 장님 코끼리 만진다라는 속담이 비슷한 상황일 것입니다.

에러에 대한 분석을 직접 어느 정도 수행해보시고나서, 잘 이해안되는 부분들에 대해서 질문을 통해 조금씩 해결해나가시는 방법이 좋습니다.

UnicodeDecodeError의 경우도 에러메세지 페이지에서 뷰의 어떤 코드에서 에러가 발생하는 지 확인해보시고, 디버거를 통해 어떻게 에러상황를 확인해보세요.

이렇게 긴 코드만 보여주시면 저 역시 상상을 할 수 밖에 없거든요.

그리고 delete요청의 경우도 디버깅을 해보시면, delete 버큰 클릭 시에는 .data 의 값이 어떤지 확인해보시고, 만약 .data 에 값이 없다면 뷰셋 기본의 delete 에서는 cart id가 어떻게 전달이 되고있는 지 확인해보세요.

분석없이 답만 얻으면, 학습되는 것이 없습니다. 단지 타이핑 연습에만 그칠 수도 있어요.

화이팅입니다. :-)

tprpek님의 프로필 이미지
tprpek
질문자

2022. 11. 22. 23:20

넵 친절한 답변 감사합니다!!

0

이진석님의 프로필 이미지
이진석
지식공유자

2022. 11. 17. 19:21

안녕하세요.

login_required 장식자는 함수뷰에만 적용이 가능하며, 클래스 메소드에는 적용이 불가합니다.

함수뷰에서의 첫번째 인자는 request이며 user 속성이 있죠. 그래서 login_required 장식자도 첫번째 인자가 request임을 가정하고 user 속성을 읽으려 합니다.

그런데 클래스뷰에서 get 메서드의 첫번째 인자는 self 입니다. 쓰신 코드에서는 CartView 인스턴스입니다. 그래서 CartView 객체에 user 속성이 없다는 에러 메세지가 나왔던 것이구요.

클래스 메서드에 장식자를 적용하실 때에는 method_decorator 장식자를 통해서 등록하셔야 합니다. 아래 공식문서에서 method_decorator 부분을 참고해보세요.

https://docs.djangoproject.com/en/4.1/topics/class-based-views/intro/

그런데 APIView는 웹페이지가 아닌 api목적이기에 login_required 장식자는 적절하지 않습니다. DRF의 permission_classes 설정을 하시는 것이 맞습니다. 그리고 JsonRespose보다 DRF의 Respose가 더 맞습니다.

화이팅입니다. :-)

tprpek님의 프로필 이미지
tprpek
질문자

2022. 11. 17. 19:27

친절한 답변 너무 감사합니다!! login_required 장식자를
permissions_classes = [IsAuthenticated] 로 바꾸었고 저희가 쇼핑몰 아이폰 앱으로 만들예정이라 JsonResponse를 사용하였는데 이경우에도 DRF의 response로 바꿔야 할까요?

tprpek님의 프로필 이미지
tprpek
질문자

2022. 11. 17. 20:22

현재 선생님께서 알려주신대로 코드를 수정하고 test를 진행하고있는데imageimage이와같이 json 타입으로 data를 post했을때 이러한 오류가뜨는데 코드의 문제일까요 아니면 data를 잘못입력한것일까요?

tprpek님의 프로필 이미지

작성한 질문수

질문하기