이전 포스트까지 CRUD Operation을 구현해보았다.
한 가지 특이점이 온다.
1) 왜 글을 생성하거나 수정할 때는 views.py에서 두 개씩 메소드를 정의해야하는 걸까?
Create | new, create |
Read | detail |
Update | edit, update |
Delete | delete |
Create와 Update도 하나의 메소드에서 정의가능하다.
그 방법을 알아보자
목표
- Create와 Update를 각 하나의 메소드로 정의하기
- GET과 POST 방식의 차이를 알기
Create 메소드 수정
1) index.html
index.html에서 'new' 로 지정해줬던 url 템플릿 테그를 'craete' 로 수정
<a href="{% url 'create' %}">새 글쓰기</a>
2) new.html
new.html에서 form 태그 안의 method 속성 값을 POST로 지정해준다.
또한, 태그 안에 csrf 토근을 생성해준다.
<form method="POST" action="{% url 'create' %}">
{% csrf_token %}
<input type="text" name="title">
<input type="text" name="content">
<input type="submit" value="작성하기">
</form>
! CSRF(Cross-site Request Forgery)
csrf는 사이트간 요청 위조 공격법이다. 사용자의 의지와는 상관없이 공격자가 의도한대로 행동해 특정 웹 페이지의 보안을 취약하게 하거나, 서버의 데이터를 수정, 삭제하는 공격법으로 방어방법에는 referer 검증, csrf 토큰, duble submit 쿠키 등이 있다.
장고에서 csrf 토큰 방식의 방어 방법을 기본으로 제공하며 {% csrf_token %} 템플릿 태그를 이용해 사용할 수 있다.
3) views.py
def create(request):
if(request.method == 'POST'):
post = Post()
post.title = request.POST['title']
post.content = request.POST['content']
post.pub_date = timezone.datetime.now()
post.save()
return redirect('/detail/' + str(post.id))
else:
return render(request, 'new.html')
이전에 작성했던 new 메소드를 지우고, create 메소드를 위와 같은 방식으로 새로 정의해준다
create 메소드는 if문을 사용해서 두 가지 흐름을 가진다.
첫번째는 POST 방식으로 요청이 들어왔을 때, 즉 new.html 에서 create 요청이 들어왔을 때이다.
new.html 에서 form 태그 안에 method 속성 값을 POST로 명시함으로써 form 태그의 요청을 POST로 전달되게 된다.
이전에 정의했던 create 메소드와 같은 방식으로 동작한다.
두번째는 GET 방식으로 요청이 들어왔을 때, 즉 index.html 어세 create 요청이 들어왔을 때이다.
이전에 정의했던 new 메소드와 같은 방식으로 동작한다.
4) urls.py
이전에 정의했던 new 요청에 대한 path를 지워준다.
Update 메소드 수정
craete 와 비슷하므로 별도의 설명을 하지 않음
1) detail.html
<a href="{% url 'update' post.id %}">수정</a>
2) edit.html
<form method="POST" action="{% url 'update' post.id %}">
{% csrf_token %}
<input type="text" name="title" value="{{post.title}}">
<input type="text" name="content" value="{{post.content}}">
<input type="submit" value="작성하기">
</form>
3) views.py
def update(request, post_id):
if(request.method == 'POST'):
post = get_object_or_404(Post, pk=post_id)
post.title = request.POST['title']
post.content = request.POST['content']
post.save()
return redirect('/detail/' + str(post.id))
else:
post = get_object_or_404(Post, pk=post_id)
return render(request, 'edit.html', {'post' : post})
4) urls.py
이전에 정의했던 edit 요청에 대한 path를 지워준다.
GET과 POST 메소드
form 태그를 통해 GET 방식과 POST 방식을 사용해보았다.
이전 글에서 사용했던 방식은 GET 방식이며, 이번 글에서 사용했던 방식은 POST 방식이다.
둘 다 http 프로토콜에서 에서 클라이언트가 데이터를 서버에 전달할 때 사용하는 방식이다.
GET 방식은 데이터에 대한 조회(READ) 동작을 수행하기 위한 메소드다
url?<key=value>&&<key=value> 형태로 url에 데이터가 노출된 상태로 전달됨에 따라 POST 방식보다 보안에 취약하거나, url 길이 제한에 따라 큰 데이터 전송에 적합하지 않다.
POST 방식은 데이터에 대한 삽입(CREATE) 동작을 수행하기 위한 메소드다
HTTP Request 메시지의 body 안에 데이터가 담겨져서 전달되므로 GET 방식보다 안전하다.
글을 쓰거나 하는 동작을 이전 글에서 사용했던 것처럼 GET 방식을 사용할 수 도 있지만,
POST 방식을 사용하는 것이 HTTP 프로토콜 원칙을 따르는 것이다.
HTTP 메소드
'Web Programming > django' 카테고리의 다른 글
[Django] 모델 관계 (1) (0) | 2020.06.21 |
---|---|
[Django] 회원가입 기능 만들기 (5) | 2020.06.20 |
[Django] CRUD Operation(4) (0) | 2020.06.20 |
[Django] CRUD Operation(3) (0) | 2020.06.20 |
[Django] CRUD Operation(2) (0) | 2020.06.20 |
댓글