Django 10

‍박태우·2023년 4월 9일
0
post-custom-banner

#1. GET, POST 프로토콜 실습

  • GET : 주소창에 넣으면 자동으로 보내짐
  • POST : 우리가 따로 설정을 해야함
    => form을 html 내부에 선언해야 함 : form은 서버에게 보내는 요청 명세서의 느낌으로서, POST 바디 내부에 들어가는 데이터들이 form 내부에 들어가게 됨.


(hello_world.html 파일에 form 태그를 이용하여 POST 설정을 하고 버튼을 만든 코드, 아래는 서버 실행결과이다.)


(POST 버튼이 생긴 것을 확인 할 수 있다.)


(POST 버튼을 누르면 위와 같이 CSRF 에러가 발생하는데, 장고에서 POST 메소드를 이용해서 서버에 요청을 보낼 때는 항상 CSRF 토큰이라는 것을 항상 form 내부에 명시를 해줘야한다.)


(form 태그 내부에 csrf_token을 명시한 모습
csrf_token 의 역할 : 적어두면 장고가 알아서 csrf_token 을 자동 생성해줌, 장고에서 제공하는 보안기능 중 하나로서 꼭 적어줘야 POST가 작동한다.)

(csrf_token 적용후 POST 버튼을 눌러보면 뭔가 적용되는 것 처럼 보여도 바뀌는 것이 없다. 우리가 만든 view 단(요청을 처리하는 부분)에서 POST와 GET을 처리해줄 알고리즘을 적용하지 않았기 때문이다.)

(view.py 의 hello_world 함수를 위와 같이 특정 메소드일 경우 실행되는 문장을 적용)

=>text를 html 단에서 꾸려서 보내주기 위해서는 아래와 같이 쌍중괄호{{}}를 이용해서 데이터의 이름을 명시해주면 장고가 데이터의 내용을 적어서 리턴해줌


(실행 결과)






(하지만 이때 주소창을 통해 다시 들어가면 위와 같이 오류가 발생하는데, 이는 지금 POST를 통한 방법만 제공하고, 일반적인 GET 방식을 구현하지 않아서 발생한다.)

(그래서 위와 같이 hello_world 함수의 내용을 변경해 주었다.)


(일반 적인 주소 입력 (GET) 방식으로 들어가면 위와 같이 GET METHOD!!! 가 출력되는 것을 확인 할 수 있다.)


(POST 버튼을 누르고 요청방식을 POST 로 들어가면 위와 같이 POST METHOD!!! 가 출력되는 것을 확인 할 수 있다.)

#2. POST 통신을 이용한 DB 데이터 저장 실습


(데이터 꾸러미 form 내부에 서버에 보낼 내용을 지정해 줌, input 태그에 type은 text, 구분자를 name을 이용하여 구분할 수 있게 함. hello_world_input 이라는 이름을 가진 데이터를 text 타입으로 보내겠다는 뜻)


(실행 결과)


(빈 칸에 텍스트를 입력 후 POST를 누른 후의 결과 , 전송은 되지만, 서버에서 처리하는 메소드를 만들지 않았으므로 차이가 없다.)

=> 그럼 그 메소드를 한번 만들어 보자!!

(hello_world 의 if문 부분을 수정한 모습, temp 데이터에 request의 POST 중에서 hello_world_input 이라는 이름을 가진 데이터를 temp 에 대입하여 리턴 시에 temp 데이터를 리턴하는 함수로 변경하였다.)





(입력 창에 test 입력 후 POST 버튼을 누른 후의 모습, 메소드를 변경한대로 실행되는 것을 볼 수 있다.)

=> 이후 불러온 데이터를 저장하기

(model.py 의 HelloWorld 모델을 가져옴,
from accountapp.models import HelloWorld 는 위에 선언 함.

HelloWorld()는 HelloWorld 모델이라는 빵틀에서 나온 새로운 객체가 new_hello_world 라는 변수에 저장됨.

현재 HelloWorld 에는 text라는 이름을 가진 캐릭터 필드(속성값)이 있음.
그 text에 temp에 저장되어 있는 입력 받은 값을 넣어줌.

그리고 .save()를 이용하여 저장, 실제로 DB에 new_hello_world를 저장하게 되는 것이다.

함수 리턴시에도 전과 다르게 hello_world_output 이라는 이름으로 new_hello_world 객체를 내보내줌.)



* hello_world.html의 body 부분에 구현한 조건에 따른 text 출력


(hello_world_output 이 존재하면, if문 안의 태그를 생성하라는 뜻
h1 태그의 콘텐츠 또한 hello_world_output의 text 필드를 출력하라고 변경함)


(아까와 동일한 결과지만, 지금은 DB에 데이터가 저장되고 있다는 것이다. db.sqlite3에 실제 데이터가 저장되고 있는 것임.)

profile
잘 부탁드립니다.
post-custom-banner

0개의 댓글