[Flask] Get/Post-2

보통 html 문서의 form 태그를 통한 데이터의 전송에서의 중요한 속성은 method와 action이다.

예시) post 전송 방식으로 localhost/complete_send 에 url 로 전송
(정확히는 python flask 문서 전달)

- method : 전송 방식(Get 또는 Post)

- action : 값을 전달할 python flask 'View'의 위치

- python flask 동작 스크립트의 해당 위치에 값을 전달

- 위와 같은 구조로 데이터가 이동한다

get 방식 데이터 전송 방식의 경우 전송되는 데이터들에 대한 값이 모두 url 에 노출되기에 보안에 상당히 취약하고, 전송할 수 있는 데이터의 크기도 post 방식에 비해 크진 않다.

- get 방식 데이터 전송 예시

- form 양식

※ homeform.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
28
29
30
31
32
33
34
<!DOCTYPE html>
<html>
 
<body>
    <!--get 방식의 경우, method 설정이 필요하지 않다.(defualt 속성)-->
    <form action="/completeSend">
        <!--
            <table>:테이블을 생성하는 태그
                - <tr> : 행 생성
                - <td> : 열, 테이블의 칸
            태그 내부 속성
            id : html 에서 해당 태그의 고유한 값
            name : flask 에서 값을 읽어 들일 수 있게 해당 데이터가 들어갈 변수 명
        -->
        <table>
            <tr>
                <td>id</td>
                <td><input type="text" placeholder="id" name="id" id="id" /></td>
            </tr>
            <tr>
                <td>password</td>
                <td><input type="password" placeholder="password" name="password" id="password" /></td>
            </tr>
            <tr>
                <td>리뷰</td>
                <td><textarea name="review" id="review"></textarea></td>
            </tr>
        </table>
        <!--type = 'submit' 속성이 있어야 전송이 가능해진다-->
        <button type="submit">send</button>
    </form>
</body>
 
</html>
cs


- 입력 받은 값을 출력하는 페이지
※ completeSend.html 스크립트
1
2
3
4
5
6
7
8
<html>
 
<body>
    <h2>{{id}} : </h2><br>
    {{review}}
</body>
 
</html>
cs


flask 스크립트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from flask import Flask, render_template, request
 
app = Flask(__name__)
 
print(app.template_folder)
 
@app.route("/")
def homeform() :
    return render_template("homeform.html")
 
@app.route("/completeSend")
def completeSend() : 
    # request.args.get : form, get 방식으로 받은 데이터를 받는 방식
    # 매개변수로는 html form 태그에서 작성한 name 값을 쓴다.
    id = request.args.get("id")
    review = request.args.get("review")
    return render_template("completeSend.html",id = id, review = review)
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)
cs

- get 방식의 경우 html form 태그는 default 설정이 되어있음
- homeform.html → flask python → completeSend.html 의 형태로 데이터가 전송됨
※ render_templete() 로 값을 return 할 때, id = id, review = review 는 completeSend.html 에서 id, review 데이터를 갖는 id, review 변수로 사용하겠다는 것을 의미한다.
→ id, review 변수명은 completeSend.html 에서 '{{ }}' 기호 안에 사용된다.

- get 방식이기에 전송 데이터가 전부 노출된다

- post 방식 데이터 전송 예시

post 방식은 아래의 항목을 수정하면 된다.

flask
- completeSend 의 methods=["POST","GET"]
- request.args.get() → request.form.get() 수정
- 내부 로직 수정

homeform.html
- form 태그 method="post" 추가

form 태그에 대한 데이터 값은 request.form.get() 메소드로 가져온다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Flask, render_template, request
 
app = Flask(__name__)
 
print(app.template_folder)
 
@app.route("/")
def homeform() :
    return render_template("homeform.html")
 
@app.route("/completeSend", methods=["POST","GET"])
def completeSend() : 
    # request.form.get : form, post 방식으로 받은 데이터를 받는 방식
    # 매개변수로는 html form 태그에서 작성한 name 값을 쓴다.
    # 새로고침(F5)에 대하여 조건문을 통하여 get, post 방식에 대한 각각의 동작을 
    if request.method == "POST" :
        id = request.form.get("id")
        review = request.form.get("review")
        return render_template("completeSend.html",id = id, review = review)
    return render_template("completeSend.html")
 
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)
cs


homeform.html 의 경우, method = "post" 속성을 추가하기만 하면 된다.

댓글