작정하고 장고 16강 : GET, POST 프로토콜 실습 : Django로 Pinterest 따라하기!

IkSun·2023년 4월 4일

작정하고 장고

목록 보기
16/46

GET 방식을 사용하기 위해 url 에 parameter 를 추가해주면 되고, POST 방식을 사용하기 위해서는 html 안에 form 을 만들어 주어야 한다.

<!--hello_world.html-->

form 이라는 것은 쉽게 말해서 서버에게 보내는 명세서 같은 개념이라고 할 수 있다. 어떤 글을 작성한다거나, 파일을 첨부한다거나의 그 데이터들이 POST body 안에 들어가는데, 그 데이터들이 이 form 안에 다 들어가게 될것이다.

action 의 value 에는 우리가 요청하려는 url 을 넣어주어야 한다 -> 우리가 지금까찌 만든 url 주소를 <form action="/account/hello_world/"> 이렇게 넣어주면 이 주소로 요청을 보낸다는 것이고 추가적으로 method="post" 라고 명시를 해준다.

form 만 있다고 해서 끝나는것이 아닌 어떤 상호작용을 해야지 서버로 보내는것이기 떄문에 input 태그의 타입 submit 으로 버튼을 하나 만들고 버튼 모양도 다음과 같이 지정 <input type="submit" class="btn btn-primary"> ->

강의 초반에 부트스트랩을 적용했었는데 btn btn-primary 는 그 라이브러리 안에 있는 클래스들 중 하나이다. 그래서 이 btn 과 btn-primary 이 둘을 동시에 적용하게 되면 이제 primary 의 색을 가진 그
럴듯한 버튼이 만들어진다.

버튼 안에 들어갈 텍스트는 value 값으로 지정 -> value="POST"

POST 라는 버튼이 하나 생겼고 버튼 클릭시 패아자 오류가 뜬다.

장고를 이용해서 POST 메소드를 사용해서 서버에 요청을 보낼 떄는 항상 {% csrf_token %} 이라는것을 form 안에 명시를 해줘야한다.

  • {% csrf_token %} : 장고에서 제공해주는 보안 기능들 중 하나.
# hello_world.html
{% extends 'base.html' %}

{% block content %}

    <div style="height: 20rem; background-color: #38df81; border-radius: 1rem; margin: 2rem;">
        <h1>
            testing
        </h1>

        <form action="/account/hello_world/" method="post">
            {% csrf_token %}
            <input type="submit" class="btn btn-primary" value="POST">
        </form>

    </div>

{% endblock %}

이후 POST 버튼을 눌러도 큰 변화가 없다. 왜냐하면 우리가 만든 view 단에서 요청을 처리하는 부분에 POST 와 GET 을 나눠서 처리해줄 뭔가 다른 알고리즘을 적용하지 않았기 떄문이다.

# views.py
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.

def hello_world(request):
    
    if request.method == "POST":
        return render(request, 'accountapp/hello_world.html', context={'text': 'POST METHOD!!'})
    else:
        return render(request, 'accountapp/hello_world.html', context={'text': 'GET METHOD!!'})

요청을 받은 객체 안에서 method 를 찾는데 POST 메소드일 경우 기존의 rendering 방식을 쓰는데 그 안에 추가적으로 context 라는 데이터 꾸러미 안에 'text' 라는 이름을 가지고 있고 내용물은 'POST METHOD!!' 라는 문장을 리턴해줄것임.

<!--hello_world.html-->
{% extends 'base.html' %}

{% block content %}

    <div style="height: 20rem; background-color: #38df81; border-radius: 1rem; margin: 2rem;">
        <h1>
            testing
        </h1>

        <form action="/account/hello_world/" method="post">
            {% csrf_token %}
            <input type="submit" class="btn btn-primary" value="POST">
        </form>

        <h1>
            {{ text }}
        </h1>

    </div>

{% endblock %}

이것을 html 단으로 보내주기 위해서 hello_world.html 문서에 쌍 중괄호({{) 를 열고 text 라고 보내진 이 데이터 이름을 명시해주고, 만약 이 text 가 존재한다면 장고가 이 부분에다가 아까 작성했던 'POST METHOD!!' 이라는 내용을 적어서 리턴해주게 된다. 나머지의 경우에는 GET METHOD 라고 문장을 보내줄 것이다.

이 post 메서드가 어떤 객체를 생성할 떄 주로 쓰는데, HelloWorld 객체를 만들어서 db 에 저장하는것을 다음 시간에 배운다.

문제 :

url 을 http://127.0.0.1:8000/account/hello_world/ 뒤에 슬래시를 추가한 경우에는 렌더링이 안됬는데

urls.py 파일의 path 설정을 다음과 같이 수정하여 해결

urlpatterns = {
    path('hello_world/', hello_world, name='hello_world')
} # / 추가

5강 routing 부분 수정

profile
공부한 것 기록용

0개의 댓글