CS/Web

[BE-Flask] 4. HTTP

뚱요 2021. 11. 9. 02:44
반응형

 

HTTP(HyperText Transfer Protocol)

모든 컴퓨터 서비스는 인터넷 통신 규약인 프로토콜의 하나를 사용해 통신

W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다 (출처:위키피디아)

 W3(world wide web)에서 데이터 통신할때 HTTP 프로토콜이 사용되었으며 보안 기능이 탑재된 HTTPS(HTTP Secure) 프로토콜을 사용하기 시작한다. 하는데 근간이다.

명시된 URL에 데이터를 탐색하는 메서드가 프로토콜에 정의

메시지 포맷

  •  클라이언트는 서버로 요청메시지를 전달
  • 서버는  클라이언트로 응답메시지를 전달

 

요청 메시지

  • 요청 내용

e.g.) GET /images/logo.gif HTTP/1.1

  • 헤더

보기) Accept-Language: en

  • 빈 줄 (empty line)
  • 기타 메시지를 포함하여 표시된다.

HTTP 메소드

HTTP로 받아온 요청을 어떻게 처리하는 가에 대한 방식들을 제공

HTTP 메소드 RFC 요청에 Body가 있음 응답에 Body가 있음 안전  멱등(Idempotent) 캐시 가능
GET RFC 7231 아니요
HEAD RFC 7231 아니요 아니요
POST RFC 7231 아니요 아니요
PUT RFC 7231 아니요 아니요
DELETE RFC 7231 아니요 아니요 아니요
CONNECT RFC 7231 아니요 아니요 아니요
OPTIONS RFC 7231 선택 사항 아니요
TRACE RFC 7231 아니요 아니요
PATCH RFC 5789 아니요 아니요

 

응답 메시지

  • 상태표시 행(status line): 상태코드(status code)와 reason message를 포함한다. (예. HTTP/1.1 200 OK. 클라이언트의 요청이 성공적으로 전달되었음을 표시)
  • 응답 헤더필드 (예.Content-Type: text/html)
  • 빈 줄 (empty line)
  • 기타 메시지

응답 코드

코드메시지설명

코드 메시지 설명
100번대   Informational(정보) 정보 교환
200번대 Success(성공) 데이터 전송 성공,수락!
300번대 Redirection(리다이렉션) 자료 위치 변경
400번대 클라이언트 오류 주소 오기입, 잘못된 요청
500번대 서버 오류 요청 처리 불가

e.g. 404 Page Not Found  문서를 찾을 수 없음. 서버가 요 청한 파일이나 스크립트를 찾지 못함.

 

HTTP Method

서버에서 요청을 보내 응답을 받기 위해 GET, POST 방식으로 요청

route decorator의 인자로 URL 접근에 대해 몇가지 다른 방식을 제공

기본값으 GET요청에만 응답

@app.route("/",methods =["GET"]) #GET 방식만 사용
@app.route("/",methods =["POST"]) #GET 방식만 사용
@app.route("/",methods =["GET","POST"]) #두 방식 사용

GET 요청 :

url 파라미터

작은 양의 데이터

POST 요청 :

전달하려는 정보가 HTTP body에 포함

많은 양의 데이터 

 

  • 플라스크 프레임워크에서 요청에 대한 정보는 request에 담겨있고 객체는 안전을 보장한다. 
  • 이 request 모듈에는 HTTP 메서드에 대한 정보를 얻을 수 있는 method와 GET 방식으로 URL에 인자를 'key=value' 형태로 전달했을 때 그 인자를 참조할 수 있는 args, POST나 PUT 방식의 HTML 폼 데이터를 얻을 수 있는 form 속성이 있다.

 

 

(1) GET 

  • 브라우저가 어떤 페이지에 저장된 정보를 얻기 위해 모든 데이터를 url로 보내  서버에 요청하고 서버는 그 정보를 보낸다. 
  • url에 파라미터 값을 넣어 서버에 데이터 전송
    • url?키=값   
  •  2개 이상의 파라미터 작성시 '&'로 연결하여 추가
    • url?키1=값1&키2=값2  
  • 길이제한이 있음
  • 보안에 취약

 

 

GET 요청으로 들어온 데이터들을 키 값을 가지고 하나씩 볼 수 있음

초기값 지정하지 않으면 기본 null

request.args.get(이름)
request.args.get(이름,초기값)

 http://localhost:5000/?name=foo&age=12

각 name, age 키의 값 foo, 12 가져옴

from flask import Flask,jsonify, request

app = Flask(__name__)

@app.route('/',methods=['GET'])
def user():
    name=request.args.get('name','이름')
    age=request.args.get('age','나이')
    return  name + " : " +age

(2) POST

브라우저는 서버에게 새로운 정보를 전송하도록 특정 URL에 요청하고 그 정보가 오직 한번 저장되는것을 보장.

보통 HTML body/폼을 통해서 숨겨서 서버에 데이터 전송하는 방식(주로 입력창)

다양한 데이터에 적용 가능

 

request.form()

 

form 태그의 action, method가 route와 함수명과 일치해야한다.

input.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>POST method in Flask</title>
</head>

<body>
	<form action="/post" method="post">
	​	<p>Name: <input type="text" id="input" name="input" placeholder="Type your name here!"></p>
		<p><input type="submit" value="Submit" onclick="alert('Submitted!')" /></p>
	</form>
</body>
</html>

app.py

from flask import Flask, render_template, request
app = Flask(__name__)

@app.route("/")
def home():
	return render_template('input.html')

@app.route("/post",methods=['POST'])
def post():
	val = request.form['input']
	return "Welcome %s" %val

if __name__ == "__main__":
		app.run()

루트에서 input.html 파일 호출

제출하면 post메소드로 요청이 들어오면서 /post  로 이동, 폼에 입력된 입력값이 출력된다.

해당 주소로 직접 접근하면 요청된 주소에 GET 메소드가 허락되지 않는다라는 에러가 나온다. 

(3) GET & POST

각 요청에 따라 페이지 처리 할 수 있도록 조건문 사용

@app.route("/user",methods=['GET', 'POST'])
def post():
	if(request.method =='POST'):
		...
	#elif(request.method == 'GET'):
	else:
    	...
        return ...

 

 

from flask import Flask, render_template, request
app = Flask(__name__)

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
            
        else:
            error = 'Invalid username/password'
            
    # 요청이 GET 이거나, 인증정보가 잘못됐을때 실행.
    return render_template('login.html', error=error)

에 접근한 username, password 키가 존재하지 않으면  KeyError가 발생

 예외처리를 하지 않는다면 HTTP 400 잘못된 요청(Bad Request)에 대한 오류 페이지를 보임

출처:

https://ko.wikipedia.org/wiki/HTTP

 

HTTP - 위키백과, 우리 모두의 백과사전

HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3

ko.wikipedia.org

 

https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html#id16

 

빠르게 시작하기 — Flask 0.11-dev documentation

웹 어플리케이션에 있어서 클라이언트에서 서버로 보내는 데이타를 처리하는 것은 중요한 일이다. Flask에서 이 정보는 글로벌한 request 객체에 의해 제공된다. 여러분이 파이썬 경험이 있다면,

flask-docs-kr.readthedocs.io

 

반응형