Django - HTTP 요청 메서드
- 클라이언트가 웹 서버에게 사용자 요청의 목적/종류를 알리는 수단
1. 요청 메서드의 종류
GET
- URL 형식으로 웹 서버측에 리스소를 요청한다.
- 파라미터를 넘겨서 해당하는 본문형식을 받는다.
POST
- 클라이언트에서 서버로 요청 데이터를 HTTP body에 담아서 웹서버로 전송한다.
HEAD
- GET과 비슷하지만, 실제 문서를 요청하는 것이 아닌 문서 정보를 요청
PUT
- POST 처럼 정보를 서버로 제출하는 것으로 형식은 동일하나, 갱신 위주의 요청
DELETE
- 웹 리소스를 제거
OPTIONS
- 가능한 메서드 옵션에 대한 질의
보안상의 이유로 대부분의 웹서버가 GET과 POST의 두 가지 요청만 허용한다. GET은 보통 데이터를 조회할 때 사용하고, POST는 데이터베이스에 영향이 끼치는 일을 수행할 때 사용한다.
이전 포스트에서 CRUD를 구현할 때 모두 GET방식으로 요청을 했다. Read는 데이터 조회이기 때문에 문제가 없지만 나머지는 보안상 문제가 될 수 있다. GET방식은 url에 파라미터를 이용해서 정보를 담기 때문에 데이터 베이스에 데이터를 추가하거나 수정할 때, 민감한 정보가 url에 노출될 수 있다. Delete 역시 권한이 없는데도 데이터를 삭제할 수 있기 때문에 위험하다.
GET 메서드 데이터
&date=GET+Method&push_up=GET+Method&pull_up=GET+Method
위는 Create 동작시 GET메서드를 사용했을 때, url 뒷 부분이다. 사용자가 입력한 데이터가 모두 url에 파라미터로 저장되었음을 볼 수 있다.
POST 메서드 데이터
이건 POST 메서드의 전체 url이다. url에 아무 데이터가 없다.
개발자 도구로 보면 body
안에 정보가 들어있다는 것을 알 수 있다.
2. GET을 POST로
def delete(request, pk):
record = Record.objects.get(pk=pk)
record.delete()
return redirect('records:index')
delete
함수는 보다시피 url 요청만 잘 넘어오면 언제든지 삭제를 진행한다. pk
값을 url에 담아서 보내면 삭제를 진행한다.현재 데이터가 하나가 만들어져 있고해당 데이터의 pk
는 6이다. url주소를 아래 양식에 맞게 직접 타이핑하면 GET 메서드 요청이 전송되고 삭제가 된다.
<h3>운동 일자 : {{ record.date }}</h3>
<p>팔굽혀 펴기 : {{record.push_up}}</p>
<p>턱걸이 : {{record.pull_up}}</p>
<a href="{% url 'records:edit' record.pk %}">수정</a>
<form action="{% url 'records:delete' record.pk %}" method="POST">
{% csrf_token %}
<button>삭제</button><br>
</form>
<hr>
<a href="{% url 'records:index' %}">처음으로</a>
delete.html 파일의 삭제버튼을 만들고 요청을 method
를 POST로 지정했다. 이제 삭제 버튼을 누르면 POST 요청을 한다.
def delete(request, pk):
record = Record.objects.get(pk=pk)
if request.method == 'POST':
record.delete()
return redirect('records:index')
else:
return redirect('records:detail', record.pk)
views.py의 delete
함수를 위와 같이 수정했다. POST 요청일 경우에만 데이터를 삭제하고 목록 페이지로 redirect
해주고 나머지는 모두 상세 페이지로 redircet
한다.
3. Django View Decorator
데코레이터란 특정 함수에 기능을 함수를 수정하지 않고 추가해주는 함수를 말한다. Django에서는 HTTP 기능을 지원하기 위해 view에 적용할 수 있는 여러 데코레이터를 지원한다.
특정 메서드에 대해서만 엑세스를 허용하는데, 요청이 허용되지 않으면 405 Method Not Aollowed) 에러가 발생
require_http_methods([요청 메서드])
require_GET()
require_POST()
require_safe()
데코레이터를 이용해서 delete
함수를 수정하면 다음과 같다.
@require_POST
def delete(request, pk):
record = Record.objects.get(pk=pk)
record.delete()
return redirect('records:index')
Read 동작의 경우 require_safe()
를 이용했다. require_GET()
을 사용해도 되지만 보안상 전자를 사용하는 게 좋다. Create와 Update 동작은 GET과 POST가 둘 다 가능하도록 데코레이터를 추가했다.
참조
Author And Source
이 문제에 관하여(Django - HTTP 요청 메서드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@main_string/Django-HTTP-요청-메서드저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)