앎을 경계하기

Programming/Python

FLASK 3 - get, post 분기 생성/클라이언트에서 서버로 데이터 전송

양갱맨 2020. 12. 17. 12:18

웹 페이지에서 로그인을 하는 경우와 같이 사용자가 어떠한 입력을 통해 서버에 데이터를 전송해야하는 경우가 있다.

이 때 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.htmlform 태그의 methodGET으로 변경하여 실행해보자.

<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