오늘 한 것
- DRF 1강 수강 및 정리(링크)
- 페어프로그래밍
장고에서 PUT 쓰기
def view(request):
if request.method=="PUT":
data_a=requset.PUT.get("data_a","")
위와 같이 Django에서 PUT을 POST 처럼 써서 데이터를 뽑아내려하면 아래와 같은 에러를 볼 수 있다.
'WSGIRequest' object has no attribute 'PUT'
시도: 헉 장고에서는 PUT 못쓰나바 그럼 걍 포스트 쓰지 모
delete는 get 쓰고 put은 그냥 post 쓰고 실제 DB동작만 맞추면 되지 ㄹㅇㅋㅋ
그렇게 팀 프로젝트를 마치고서 피드백 시간때 회초리 맞았다(비유적 표현이다). 장고에서 PUT을 처리하지 못하는 어쩌구, DRF도 PUT이 저쩌구 했던 정보들이 잘못됐거나, 내가 잘못 이해한듯 하다. 아니 사실 '한듯 하다'가 아니라 찾아보다가 머리아파서 그만 둔게 맞다. 그래서 다시 찾아보았다.
https://haah.kr/2017/05/23/rest-http-method-in-html-form/
REST - HTML Form에서 GET/POST만 지원하는 이유
연재 목록 REST - 긴 여정의 시작 REST - HTML Form에서 GET/POST만 지원하는 이유 REST - 논문(요약) 훑어보기 REST - REST 좋아하시네 REST - Roy가 입을 열다 REST - 당신이 만든 건 REST가 아니지만 괜찮아 REST -
haah.kr
Django에서 PUT을 못 쓰는줄 알았지만, 사실 그게 아니다. 이는 HTML 폼 태그가 GET과 POST만 지원하기 때문이다. 그러니까 당신이 프론트에서 PUT 메소드에 폼 태그로 데이터를 보내든, 포스트맨으로 리퀘스트 바디에 폼-데이터를 실어보내든 상관없이 데이터는 제대로 전송되지 않을 것이다.
해결: 그럼 어떻게 써야하는가
오늘 DRF강의에서 들은 'Content-Type'에 해답이 있었다. Content-Type 헤더는 말 그대로 전송되는 데이터의 타입을 지칭하는 헤더다. 이것에 따라 데이터를 받는 쪽이 데이터를 어떻게 표현할지를 정한다.
폼을 이용해서 전달한 경우라서 content-type이 form-data 이나 x-www-form-urlencoded 라면, Django views.py에서 request에 포함된 QueryDict에 접근해서 데이터를 가져올 수 있다. 그리고 POST 와 GET은 이런 이름에 form이 들어가는 Content-Type들을 처리할 수 있으므로 처음에 언급한 방식으로 처리가능하다.(정확히 아는건 아니라 내 말을 믿진 말라)
그러나 PUT과 DELETE는 form이 지원하지 않으므로 다른 방식으로 데이터를 전송하면 된다. 바로 'application/json'이다.
포스트맨에서 application/json으로 데이터 보내기
위와 같이 body - raw - json을 선택해서 json 형태로 데이터를 작성해서 보내주면 된다. 코드를 보면 content-type도 잘 되어있고 body에 데이터에도 JSON 형태로 저장됨을 알 수 있다.
참고로 폼으로 저장하면 저렇게 된다.
프론트에서 application/json으로 데이터 보내기
fetch나 ajax를 이용하면 된다.
fetch(url, {
method: "PUT",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
.then(response => {
// Handle the server response
})
.catch(error => {
// Handle any errors
});
$.ajax({
url: "url",
type: "PUT",
data: JSON.stringify(data),
contentType: "application/json",
success: function(response) {
// Handle the server response
}
});
백엔드에서application/json으로 데이터 받기
req = json.loads(request.body)
locate = req.get('locate', '')
description = req.get('description', '')
혹은 아래 stack over flow 에 나온 방법들을 이용할 수 있다.
Django - Where are the params stored on a PUT/DELETE request?
I'd like to follow the RESTful pattern for my new django project, and I'd like to know where the parameters are when a PUT/DELETE request is made. As far as I know, I only see GET & POST Query...
stackoverflow.com
강의와 문제 해결로 부터 배운점
웹의 기초 동작에 대해 다시 상기하였다.
form이 PUT과 DELETE를 사용할 수 없음을 알게 되었다.
다양한 헤더들의 기능에 대해 새롭게 알게 되었다.
레퍼런스
https://eunjin3786.tistory.com/133
[Django] HTTP Request를 받아서 응답해주기 (GET, POST, PUT, DELETE)
이 포스팅은 총 2단계로 이루어집니다. 👉 1단계 : HTTP Request를 잘받는 지 확인 + GET 요청에는 더미 JSON 주기👉 2단계 : 실제 HTTP Method 동작을 하며 데이터를 건들이기 1단계 장고의 View 는 아래의 H
eunjin3786.tistory.com
'TIL' 카테고리의 다른 글
23.04.20 TIL (JSON과 JS objects) (0) | 2023.04.20 |
---|---|
23.04.19 TIL(CORS) (0) | 2023.04.20 |
23. 04.17 TIL (1) | 2023.04.17 |
23.04.14 TIL(django웹서비스에 image업로드 구현) (0) | 2023.04.16 |
23.04.13 TIL (0) | 2023.04.13 |