티스토리 뷰

Web/Django

[Django] HTTP+ GET과 POST

HAN_PY 2020. 7. 8. 17:49
반응형

 

 

form = ArticleForm()순서정리

요청 응답

GET POST

 

 

HTTP(HyperText Transfer Protocol)

웹에서 이루어지는 모든 데이터 교환의 기초이자

HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜(규약, 약속)이다.

1996년 - HTTP/1.1

2015년 - HTTP/2

기본적으로 2타입으로 나뉜다

요청(request) 응답(response)

 

요청(request)

우리는 웹서버에서 가장 기본이 되는 프로토콜인 HTTP를 통해서 요청과 응답을 처리하고 있다.

HTTP 요청을 보낼 때 url, Method, Path, version of th protocal, Headers가 필요하다.

 

HTTP의 Method

Mothod의 종류에는 GET(특정 리소스 요청), POST(특정리소스에 엔티티를 제출), PUT(리소스 수정), DELET(리소스 삭제) ... 등이 있다.

 

보통 클라이언트가 수행하고자 하는 동작을 정의한 GET, POST 같은 동사나, OPTIONS나 HEAD와 같은 명사이다. 일반적으로 클라이언트는 리소스를 가지고 올 때, GET(데이터를 받기만 함)을 사용하고, HTML Form의 데이터를 전송 할 때 POST(리소스에 엔티티를 제출하거나 상태를 변화한다.)를 사용한다.

 

 

 

 

응답(response)

응답 시 version of the protocal, status code, status message, Headers 등이 있다.

 


HTTP 상태 코드

2xx성공

200              ok

 

 

 

3xx성공(redirect 됐다. 원래경로 말고 다른 경로로 임시로 이동)

301               Moved Permanently

302              Found

 

 

 

4xx 클라이언트 이슈

400              Bad Request

401              Unautherized  로그인x

403              Forbidden    권한x(매니저x)

404              Not Found   url이 x

405              Method Not Allowed       GET인데 POST로 보냈을 떄

 

 

5xx 서버이슈

500              internal server Error

 

 


만약 에러가 났을 때, 내가 만든 html을 보여 주고 싶다면,

우선 settings.py의 26번 쨰줄의

DEBUG = True 을

DEBUG = False로 바꾸자. 

그러면 오류발생 시 디버깅 되지 않고 자동으로 아래의 위치에 속한 html로 넘어간다.

 

app 내부의 templates가 아닌, base.html이 있는 최상위 templates에 에러의 이름으로 보여주고 싶은 html을 만든다.

project/templates/404.html

project/templates/500.html

이런식으로 html으로 파일명만 만들어 주면 django가 error발생 시 자동으로 저쪽으로 보낸다.

 


URL(Uniform Resource Locators)

웹에서 정해진 유일한 자원의 주소

url의 각각의 이름

 

http://

protocal

 

www.example.com 

Domain Name

 

:80

Port (일반적으로 생략)

HTTP -> 80

HTTPS -> 443

 

/path/to/myfile.html

path to the file

url을 지정한 것(framework)

 

?key1=value1&key2=value2

Parameters

 

#SomewhereInTheDocument

Anchor(앵커)

한 문서에서 해당 위치로 넘어가는 거다.(문서내부)

긴 page에서 옆에 목차 누르면 새로고침되는게 아니고 긴 page중 특정 위치로 이동된다.

 

HTML에서 사용가능한 URL의 종류

 

  • <a> 링크
  • <link>, <script> 문서의 연결
  • <img>, <videi>, <audio> :미디어, <iframe>등에 사용

 

 

POST와 GET

form 부분을 get으로 보내면 문제점이 발생한다. 왜냐하면 URL은 길이 제한이 있기 때문이다. 즉, 내용 부분을 길게 적으면 url이 너무 길어지기 때문에 안 넘어간다.

무언가를 가지고 올 떄는 GET방식이지만, 데이터로 무언가를 저장 할 떄는 url로 저장하지 않는다.

브라우저 상에서 JS를 제외하고 유일한 순수 HTML/CSS를 보낼 수 있는 건 GET(<a  >, <form  >)과 POST(<form   >) 2가지가 유일하다.

 

+ 그러나 모든 form은 POST라고 할 수 없다. 검색은 DB의 상태변화가 아니라 DB의 검색 결과를 요청하기 때문이다.

 

따라서 get을 post로 바꾸는 이유는 

1. url의 길이 제한

2. 역할이 다르다. GET은 정보를 가져오는 것이고, POST는 DB값을 저장하는 것이다.

 

 

GET을 POST로 바꾸는 방법으로는 2가지 절차가 있다.

1. form 태그에 method="POST"를 추가하자. 그리고 해킹방지를 위해 {% csrf_token %}도 form에 추가한다.

csrf 이부분은 settings.py의 MIDDLEWARE에서 처리한다.

2. views에서

article.title = request.GET.get('title') 을 article.title = request.POST.get('title')로 바꿔야 한다.

request.GET

GET으로 받았을 때,

GET 요청으로 넘어온 값을 딕셔너리 형태로 저장한다.

POST로 받았을 때, request.GET은

<QueryDict:{}>와 같이 이런식으로 비어있다.(물론 GET으로 보낸걸 받았을 떄는 차있다.)

비어있으니 당연히 저장 불가가 뜨고 IntegrityError뜨면서 NOT NULL제약 조건에 실패 했다고 뜬다.

 

request.POST

POST 형태로 넘어온 값을 관리한다.

POST로 받으면 <QueryDict:{'csrfmiddlewaretoken'=['asdfasdf'], 'title'=[''asdf], ~~~~~~}>와 같이 넘어온다.

 

 

 

GET(특정리소스의 포시)

url로 보내는 주소창에 치는 모든것이다.

따라서 크기가 제한되어있고 보안 이슈가 있다.

 

POST(특정리소스에 제출)

서버의 상태 변화를 일으키고 HTTP요청 메세지의 body를 통해 보낸다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함