- new FormData는 <form> submit과 다를까?2023년 11월 01일 21시 23분 13초에 업로드 된 글입니다.작성자: sue24
리액트에서 장고 서버에 csrf토큰을 보내줘야 했는데
submit이 아니라 axios로 직접 보내주고 싶었다
(리액트에서 csrf토큰을 넣는 건 쿠키에서 파싱해서 인풋 태그에 넣는 방식으로 해결했다)
인터넷에서 찾아서 나름 조치를 취해서 보냈는데 토큰이 가지 않아서
form submit으로 보내니 갔다
FormData가 form처럼 데이터를 보내는 형식인 줄 알았는데 아니었던 걸까?
같은 형식인 건 맞다
하지만 내가 csrf토큰을 첨부하는 것에 대해 오해하고 있었서 다른 결과가 나왔다
헤더에 설정을 해주면 된다고 해서 그걸로 끝인 줄 알았는데 그게 문제가 아니었다
<input type="hidden" name="csrfmiddlewaretoken" value={csrftoken}/>
이게 form 태그에 csrf토큰이 첨부될 때의 모습이다
그러면 이 csrf토큰을 직접 FormData에 추가해줘야 했다(submit이면 알아서 추가가 되지만..)
그리고 그 동안은 항상 직접 FormData에 데이터를 추가해주기만 했는데
이번에 찾아보면서 form 엘리먼트를 넣어서 생성하면 자동으로 내부 데이터가 추가된다는 것을 알았다
FormData 다루기
const formElement = document.getElementById('myForm'); // <form id="myForm"> const filledFormData = new FormData(formElement); const emptyFormData = new FormData();filledFormData처럼 formElement를 넘겨주면 form#myForm의 인풋 데이터가 설정된 FormData가 만들어진다
emptyFormData처럼 만들면 하나씩 데이터를 추가해줘야 한다
const formData = new FormData(); formData.append('username', 'tester01'); formData.append('email', 'abc@test.com');여러 데이터를 하나의 append로 추가할 수는 없고 하나씩 추가해줘야 한다
파일 추가도 가능하다
const fileInput = document.getElementById('fileInput'); const file = fileInput.files[0]; formData.append('file', file);데이터 값이 배열인 경우에는 키 값을 동일하게 둔 append문을 여러개 쓰면 된다
const genre = ['classic', 'R&B', 'hiphop']; for (var i = 0; i < genre.length; i++) { formData.append('genre', genre[i]); }특정 값을 지우고 싶은 경우에는 키를 넣으면 된다
formData.append('username', 'johnsmith'); formData.delete('username');csrf토큰 추가는 어떻게 해야 했던 걸까?
csrf토큰도 그냥 인풋이라서 똑같이 더해주면 된다
formData.append('csrfmiddlewaretoken', csrf_token);'JS' 카테고리의 다른 글
amCharts5 지도 줌, overlay (0) 2022.06.10 amCharts5 세계 지도 - 나라별 (0) 2022.06.09 amCharts5 튜토리얼 (0) 2022.06.08 함수도 오브젝트! (0) 2020.11.03 Objects and the dot (0) 2020.08.25 다음글이 없습니다.이전글이 없습니다.댓글