페이지에서 페이지로 이동할 때 단순히 페이지에서 페이지로 데이터가 이동하지 않다는 것을 flask 의 구조에서 알 수 있다.
참고 글
Java 계통의 Jsp/Servlet, Spring의 웹 개발 구조 중 널리 사용되는 패턴은 'MVC' 계통의 패턴이다.
Flask 또한 위와 유사한 패턴을 사용한다.
| - Flask MVT 패턴 |
| - MVC 패턴(간소화) |
Flask 에서의 Template 가 View 의 역할을 하므로 사실상 용어의 변경만 있을 뿐 동일한 역할을 한다.
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의 경우 별도의 '가로채기'의 경우가 아닌이상, 확인이 불가하다
댓글
댓글 쓰기