파이썬(Python)/Flask

파이썬 Flask 기능 정리 - url_for, HTTP 요청(GET,POST,PUT,DELETE,OPTIONS)과 처리방법

끄적끄적아무거나 2021. 1. 28. 15:00
반응형

참조 링크 (link)>>

flask.palletsprojects.com/en/1.1.x/quickstart/

 


 

 

url_for 함수

 

url_for 함수는 url 주소값을 가져 온다. url_for( ) 괄호안에 route 함수 명을 넣으면 해당 route가 가지는 url 주소를 가져온다. 그리고 괄호에 다른 항목은 변수명이다. 변수 명을 넣으면 변수명을 포함한 주소값을 가져온다. 

 

해당 내용은 아래 예제 코드를 통해 이해하는 것이 쉽다. 

 

아래 코드에서 with 는 파일 같은 형식을 열때 사용한다. (파일은 with 로 열때 별도의 close 문을 사용하지 않아 편리하다. close 문에 __exit__으로 종료 한다. test_request_context 도 dir 로 읽어 보면 __exit__ 문이 있다 즉, 끝나면 닫아줘야 한다.)

 

test_request_context 함수는 클라이언트(웹브라우져)에서 서버로 request 보낼 때 받을 수 있는 context 를 가져와 준다. 만일 해당 함수를 사용하지 않고 url_for를 해서 print 하면 request 가 들어가지 않은채로 읽으려고 한거니 실패한다. login() 함수 밑에처럼 request 다음에 url_for를 출력하는 것은 가능하다. 그렇지 않으면 test_request_context 로 읽어야 한다.

 

코드>>

from flask import *
from markupsafe import escape

#########################################################
# Flask 선언
app = Flask(__name__, template_folder="templates")

@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    print(url_for('login'))
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return '{}\'s profile'.format(escape(username))


with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))


if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True, port=9999)

 

결과>>

 

위 결과에서 %20은 띄워쓰기를 의미한다. 웹브라우져에는 그냥 스페이스로 띄워도 실제 서버로 갈때는 저런식의 주소로 전달 되는 것이다. 

login의 next 변수 값는 "/" 넣었는데 그러면 주소는 위처럼 "?"로 연결된다. (페이지 번호 바꿀때 등으로 사용)

 

 

 


 

 

HTTP 요청(GET,POST,PUT,DELETE,OPTIONS)과 처리방법

 

우리가 웹브라우져를 이용해서 웹서버에 접근할때 HTTP 요청을 서버에 보내고 서버는 요청을 보고 그에 맞춰 처리한다. 아래 그림은 내가 웹페이지에 접근해 보고 이때 나온 HTTP 요청을 Wireshark로 캡쳐한 화면이다.

 

HTTP GET

참조 링크에서는 요청 method를 아래와 같이 정리하였다. 

 

 

 

간단히 정리하자면 GET은 서버에 페이지를 요청하는 것이고 POST 는 브라우져에서 서버로 정보를 보내고 싶을 때 (암호화) 되어서 전달 한다.  Head 는 페이지의 헤더 정보만 요청할 떄 사용하고 OPTIONS은 해당 페이지가 어떤 요청을 처리할 수 있는 지 알아볼때 보낸다. 

 

아래 예제를 통해 이해보자. route에서 ( ) 안에 url 로 서버에 접근하면 method가 GET 과 POST 일때만 받는 것이다. 처음에 접근하면 GET으로 페이지 요청이 들어간다. bulletin_wr.html도 아래에 있다. 페이지 접근하면 버튼이 있는데 버튼을 클릭하면 form 이 POST 로 전달되고 POST 를 리턴해 준다.

 

코드>>

from flask import *

#########################################################
# Flask 선언
app = Flask(__name__, template_folder="templates")



@app.route('/bulletin_wr', methods=['GET', 'POST'])
def bulletin_wr():
    if request.method == 'POST':
        return 'POST'
    else:
        return render_template("bulletin_wr.html")


if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True, port=9999)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <body>
        <table>
            <form name="form" method="POST" action="/bulletin_wr">
                <tbody>
                    <tr>
                        <td>GET</td>
                    </tr>
                    <tr>
                        <td><input type="submit"></td>
                    </tr>
                </tbody>
            </form>
        </table>
    </body>
</html>

 

결과>>

 

반응형