1️⃣ http://127.0.0.1:8000/read/1/
2️⃣ http://127.0.0.1:8000/read/?id=1
이 둘은 같은 곳을 가리키고 있다. 다만, 두 번째가 생활코딩님에 따르면 전통적인 방식이고 표준이다. 이는 서버한테 어떤 정보를 질의할 때 사용한다고 해서 query string
이라고 한다.
최근엔 누가봐도 2️⃣는 지저분해 보이기 때문에 1️⃣을 더 선호한다고 한다.
전 강의에서 submit버튼을 사용하면 다음과 같은 url이 뜬다.
http://127.0.0.1:8000/create/?title=CRUD&body=CRUD+is...%0D%0A
위 url은 1️⃣,2️⃣와 목적이 다르다.
1️⃣,2️⃣는 데이터를 읽어가는 get역할이고
이 url은 서버에 있는 데이터를 변경하는 작업이다.
인스타그램 또는 페이스북에서 셀럽이 글을 생성했다고 해보자. 이 때 위와 같은 url을 사용할 경우 방문자들이 방문할때 마다 글이 추가되는 문제가 생긴다.
이를 방지하고 자 우리는 post
를 사용하고자 한다.
이 경우 Response header에 정보를 포함시켜 보내 위와 같은 문제를 해결 할 수 있다.
from django.shortcuts import render, HttpResponse
from django.views.decorators.csrf import csrf_exempt
...
@csrf_exempt
def create(request):
article = '''
<form action="/create/" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea name="body" placeholder="body"></textarea></p>
<p><input type="submit"></p>
</form>
'''
...
create함수 안 form에 method
를 post
로 설정하면 get 방식에서 post방식으로 바뀐다. 하지만 CSRF 에러
가 나게 되는데 이는 django의 보안기능이다.
지금은 이 보안 기능을 다루진 않고 skip할 수 있는 방법을 찾아 보겠다.
from django.views.decorators.csrf import csrf_exempt
를 추가하고 스킵할 함수에 @csrf_exempt
데코레이더를 붙여주면 보안기능을 skip할 수 있다.
데이터는 서버로 전송되었지만 아무 것도 바뀌지 않았다...
그 이유는 우리가 데이터를 서버로 전송했을 때 아무 일도 하지 않았기 때문