본문 바로가기
Web Programming/django

[Django] CRUD Operation(5)

by 테리는당근을좋아해 2020. 6. 20.

이전 포스트까지 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 쿠키 등이 있다.

 

https://dheldh77.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-CSRFCross-Site-Request-Forgery?category=823110

 

[네트워크] CSRF(Cross Site Request Forgery)

CSRF(Cross Site Request Forgery) - 사이트 간 요청 위조 - 웹 애플리케이션 취약점 중 하나 - 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 함으로써, 특정 웹 페이지의 보안을 취약하게 하��

dheldh77.tistory.com

 

장고에서 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 메소드

https://dheldh77.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-HTTP-RequestResponse?category=823110

 

[네트워크] HTTP Request/Response

HTTP Request Method - 클라이언트가 웹 서버에 사용자 요청의 목적/종류를 알리는 수단 1) HEAD - 메시지 헤더(문서 정보) 획득 - GET과 유사한 방식이지만, 실제 문서를 요청하는 것이 아닌 문서 정보를 �

dheldh77.tistory.com

 

 

'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

댓글