[Flask] Get/Post

페이지에서 페이지로 이동할 때 단순히 페이지에서 페이지로 데이터가 이동하지 않다는 것을 flask 의 구조에서 알 수 있다.

참고 글

그림만 참고 하세요

Java 계통의 Jsp/Servlet, Spring의 웹 개발 구조 중 널리 사용되는 패턴은 'MVC' 계통의 패턴이다.

Flask 또한 위와 유사한 패턴을 사용한다.

- Flask MVT 패턴




- MVC 패턴(간소화)

Flask 에서의 Template 가 View 의 역할을 하므로 사실상 용어의 변경만 있을 뿐 동일한 역할을 한다.

Get/Post

Get/Post 의 전송방식

위의 링크에 이전에 기록한 자료가 있어 링크해 두지만, 요약하면 이러하다.

Get - url에 전송할 데이터나 문자를 덧붙여 전송하는 방식

Post - '패킷' 이라는 별도의 저장 공간에 데이터를 저장하여 전송하는 방식

페이지의 설계 시 위의 전송 방식에 따른 스크립트의 구성 또한 중요하다.


예시) get/post 를 이용한 id/password 전송 예시

controller 전체 스크립트

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
from flask import Flask, render_template, request, url_for
import requests
 
app =  Flask(__name__)
 
#현재 template 저장되어있는 폴더
print(app.template_folder)
 
#기본 페이지
@app.route("/")
def home():
    return render_template("main.html")
 
#text_form, get 방식 redirect 
@app.route("/text_form")
def text_form():
    return render_template("text_form.html")
 
#methods 에 의한 get, post 방식 render_template
@app.route("/text_form/complete_send", methods=["GET","POST"])
def complete_send():
    if request.method == "POST" : #post인 경우
        id = request.form.get("id"#form에서 id 값을 받음 
        return render_template("complete_send.html", id=id) #다음 페이지로 값을 함께 전달
    return render_template("complete_send.html"# get 방식 전송 - 새로고침, 뒤로가기의 경우 값 재전송 방지
    
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000#동일 네트워크라면 외부에서 접속 가능하도록 
cs


입력 폼(form) : text_form.html

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
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>Page Title</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link rel='stylesheet' type='text/css' media='screen' href='main.css'>
    <script src='main.js'></script>
</head>
<body>
    <!--method : 전송 방식-->
    <!--action : 데이터를 전송할 controller 의 위치 또는 template -->
    <form method="post" action="{{ url_for('complete_send') }}">
        <table>
            <tr>
                <!--{{}} : jinja 방식으로 데이터를 저장할 변수명 저장-->
                <td>id</td><td><input type="text" placeholder="id" name="id" value="{{id}}"/></td>
            </tr>
            <tr>
                <td>password</td><td><input type="password" placeholder="password" name="password" value="{{password}}"/></td>
            </tr>
        </table>
        <button type="submit">send</button>
    </form>
</body>
</html>
cs

- url_for() : 해당 url에 대응되는 html 주소 반환

결과 값 표기를 위한 페이지 : complete_send.html

1
2
3
4
5
6
<html>
    <body>
        <h1>{{ id }}님</h1>
        <h2>요청 진행중 입니다</h2>
    </body>
</html>
cs


※ get 전송의 경우

- 아래의 그림처럼 url의 맨 뒷 부분에 '?' 문자 이후로 데이터 전달
- '&' 기호를 기준으로 구분함
- get 방식이 post 방식에 비해 데이터 전송이 간단하나, url에 노출되어 보안에 취약하다
- post의 경우 별도의 '가로채기'의 경우가 아닌이상, 확인이 불가하다



댓글