2017. 10. 24.

[Python] Flask - HTTP 메소드(GET, POST)

Flask - HTTP 메소드

Http 프로토콜은 WWW(world wide web)에서 데이터 통신을 하는 근간입니다. 명시된 URL로부터 데이터를 탐색하는 다른 메소드가 이 프로토콜에 정의되어 있습니다.


다음 표는 각각 다른 http 메소드를 요약한 것입니다.
Sr.No
Methods & Description
1
GET
암호화되지 않은 form의 데이터를 서버로 전송합니다.
가장 흔하게 사용되는 메소드입니다.
2
HEAD
response body를 제외하고 GET과 동일합니다.
3
POST
HTML form 데이터를 서버로 전송합니다. POST 메소드로 전달받은 데이터는 서버에 cache되지 않습니다.
4
PUT
현재 표현되고 있는 대상 resource를 업로드된 컨텐츠로 교체합니다.
5
DELETE
URL가 준 현재 표현되고 있는 대상 resource를 제거합니다.


기본값으로 Flask 라우팅은 GET request에 응답합니다. 하지만 이 설정은 route() 데코레이터(decorator)의 메소드로 변경할 수 있습니다.


URL 라우팅에서 POST 메소드를 설명하기 위해서 먼저 HTML form을 만들어야 합니다. 그리고 POST 메소드를 사용해서 데이터를 URL로 전송해야 합니다.


다음 스크립트는 login.html입니다. 이 스크립트는 templates폴더 넣으면 됩니다.


<html>
  <body>
     
     <form action = "http://localhost:5000/login" method = "post">
        <p>Enter Name:</p>
        <p><input type = "text" name = "myName" /></p>
        <p><input type = "submit" value = "submit" /></p>
     </form>
     
  </body>
</html>


다음 python 코드를 저장하고 실행합니다.


from flask import Flask, redirect, url_for, request
app = Flask(__name__)

@app.route('/success/<name>')
def success(name):
  return 'welcome %s' % name

@app.route('/login', methods = ['POST', 'GET'])
def login():
  if request.method == 'POST':
     user = request.form['myName']
     return redirect(url_for('success', name = user))
  else:
     user = request.args.get('myName')
     return redirect(url_for('success', name = user))

if __name__ == '__main__':
  app.run(debug = True)


개발 서버를 실행한 후에, login.html을 브라우저에 엽니다. text field에 name을 입력하고 Submit을 누릅니다. login.html 파일을 인터넷 브라우저에 드래그 앤 드랍하면 다음과 같은 결과를 확인할 수 있습니다.




login.html 스크립트의 내용은 간단합니다. form 태그 내부에 text input과 submit input이 있습니다. text의 input는 name으로 myName을 가집니다. Flask의 웹 애플리케이션에서는 request.form[‘myName’]으로 접근하게 됩니다. submit의 input은 value로 submit을 가집니다.


form 데이터는 form 태그의 action에 지정된 URL로 POST됩니다.


이제 Flask 웹 애플리케이션 코드를 보겠습니다. http://localhost/login은 login() 함수에 맵핑되어 있습니다. 서버는 POST 메소드로 데이터를 전달받습니다. form  데이터에서 얻은 ‘myName’ 매개변수의 값은 다음에서 얻을 수 있습니다.


user = request.form['myName']


url_for() API를 사용해서 동적으로 url을 생성하고, redirect합니다. ‘/success’ URL에 변수 부분(<name>)으로 전달됩니다. 브라우저는 전달받은 변수 부분을 welcome 메세지를 창에 보여줍니다.


이번에는 HTTP 프로토콜의 GET을 사용해보겠습니다. login.html의 매개변수를 ‘GET’으로 변경하고 브라우저에서 다시 열어봅니다. GET 메소드에 의해서 서버로 데이터가 전달됩니다. ‘myName’ 매개변수의 값은 이제 다음에서 얻어집니다.


user = request.args.get(‘myName’)


args는 form 매개변수와 그에 상응하는 값의 쌍을 포함하는 dictionary 객체입니다. POST로 전달한 데이터가 아니므로 args로 접근해야 합니다. ‘myName’ 매개변수에 상응하는 값은 앞에서 처럼 ‘/success’ URL로 전달됩니다. 결과는 앞과 당연히 동일합니다. 이 부분은 반드시 이해하지 않아도 무방하므로 참고 정도로만 생각하시길 바랍니다.

다음에 다룰 내용은 무엇인가요?

웹 템플릿 시스템(Web Template System)을 다룰 예정입니다. 웹 애플리케이션 프레임워크가 동작하는 중요한 방법이므로 좀더 자세하게 다룰 예정입니다.

댓글 없음:

댓글 쓰기