웹 페이지에서 로그인을 하는 경우와 같이 사용자가 어떠한 입력을 통해 서버에 데이터를 전송해야하는 경우가 있다.
이 때 GET과 POST 방식으로 데이터를 받는다.
학부 때 통신 수업에서 배웠던 기억을 되살리면... GET은 데이터가 전부 오픈된다는것이고 POST는 GET보다는 보안측면에서 안전하다는것..? 정도 기억난다. (포스팅 후 찾아봐야지)
접속 URL을 정하는 어노테이터의 파라미터인 methods
에 사용할 방식을 지정해준다.
app.py
@app.route("/", methods=["GET", "POST"]) # 접속 url
def index():
if request.method == "POST": # 요청 방식이 POST라면,
print(request.form.get("user")) # 안전하게 가져오는 것은 get
user = request.form.get("user") # 전달받은 user data 저장
data={"interest":"CV,deeplearning","MBTI":"ESTJ" ,"blog":"whereisend.tistory.com"}
return render_template("index.html", user=user, data=data)
elif request.method == "GET": # 요청 방식이 GET이면,
user = "양갱"
data={"interest":"CV,deeplearning","MBTI":"ESTJ" ,"blog":"whereisend.tistory.com"}
return render_template("index.html", user=user, data=data)
그리고 해당 페이지와 연결되는 함수에 request
의 멤버들을 사용하여 GET
, POST
방식에 대해 각각 동작을 지정할 수 있다.
request.form.get(name)
으로 html내 form
태그에서 전송하는 데이터를 가져올 수 있다.
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>페이지 제목</title>
<link rel='stylesheet' href="{{ url_for('static', filename='css/style.css')}}">
</head>
<body>
<h1>H1 태그 사용</h1>
이름 : {{user}}
관심사 : {{data.interest}}
MBTI : {{data.MBTI}}
블로그 : {{data.blog}}
<form action="/" method="POST">
이름 : <input type="text" name="user">
<input type="submit" value="전송하기">
</form>
</body>
</html>
body
태그 내에 form
태그를 사용해서 일종의 형식을 만들어준다.
먼저, POST
방식부터 사용해본다.
플라스크 실행을 하면, 다음과 같이 사용자 입력이 가능한 text box가 생긴 것을 확인할 수 있다.
이름으로 표시된 "양갱"이라는 데이터를 바꾸기 위해 text 창에 변경할 이름을 입력하여 전송한다.
이름 데이터가 바뀐 것을 확인할 수 있다.
이번에는 index.html
내 form
태그의 method
를 GET
으로 변경하여 실행해보자.
<form action="/" method="GET">
이름 : <input type="text" name="user">
<input type="submit" value="전송하기">
</form>
페이지 접속을 하면, 정상적으로 창이 뜬다.
다시 변경할 이름을 텍스트입력창에 넣고 전송을 누른다.
이번에는 주소 입력창에 사용자가 입력한 리소스가 표시되는 것을 확인할 수 있다.
그러나 바꾸고싶었던 이름 데이터는 바뀌지않았다.
이말은 app.py에서 나눈 요청방식 분기 부분에 문제가 있다는 것이다.
다시 app.py를 보면,
elif request.method == "GET": # 요청 방식이 GET이면,
user = "양갱"
data={"interest":"CV,deeplearning","MBTI":"ESTJ" ,"blog":"whereisend.tistory.com"}
return render_template("index.html", user=user, data=data)
user
에 "양갱"이라는 값을 지정한 것을 확인할 수 있다.
이 부분을 request.form.get("user")
로 변경하여 다시 실행하면 POST때 처럼 될 것 같지만,
GET에서는 request.args.get(name)
을 사용하여 값을 가져올 수 있다.
이름이 None으로 표시된다는 것은 user 변수에 초기값이 없기 때문이다.
페이지 접속과 입력 폼 전송 시의 상태를 나눠서 user의 값을 다르게 해준다.
elif request.method == "GET": # 요청 방식이 GET이면,
if request.args.get("user") is not None:
user = request.args.get("user")
else:
user = "양갱"
입력값을 넣고 전송하면 아래와 같이 정상 변경된다.
참고자료
https://wikidocs.net/book/4479
Uploaded by Notion2Tistory v1.1.0