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 메서드 데이터

http://127.0.0.1:8000/records/create/

이건 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에 담아서 보내면 삭제를 진행한다.현재 데이터가 하나가 만들어져 있고해당 데이터의 pk6이다. 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) 에러가 발생

Django View Decorator 참고

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가 둘 다 가능하도록 데코레이터를 추가했다.





참조

좋은 웹페이지 즐겨찾기