반응형

Flask에서는 route() 데코레이터를 사용하여 함수를 URL에 바인딩합니다.



Flask의 Quickstart 문서를 보며 진행한 과정을 작성한 글입니다. 

https://flask.palletsprojects.com/en/2.0.x/quickstart/ 

 

부족한 부분이나 이상한 부분이 있을 수 있습니다. 

 

개발 환경 구축은 다음 포스트를 참고하세요

 

Windows 10 환경에서 Visual Studio Code와 Miniconda를 사용한 Flask 개발 환경 만들기

https://webnautes.tistory.com/1522 

 

Miniconda를 설치하지 않고  pip install flask 명령으로 해도 상관은 없습니다.




2021. 12. 19 - 최초작성. 미리 작성해놓았던 글인데 이제서야 첫번째 글에 이어서 공개합니다. 




다음 코드를 routing.py로 저장합니다. 

 

from flask import Flask

app = Flask(__name__)

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

@app.route('/hello')
def hello():
    return 'Hello, World'




다음처럼 실행합니다. 

 

set FLASK_APP=routing

flask run



웹브라우저에서 확인해보면 http://127.0.0.1:5000/http://127.0.0.1:5000/hello 에서 보여지는 웹페이지가 다릅니다. 

 

URL이 /로 끝나는 경우와 /hello로 끝나는 경우를 각각 route 데코레이터를 사용하여 다른 함수에 연결해놓았기 때문입니다. 

각각 함수에서 리턴되는 값이 다르기 때문에 웹페이지에서 다르게 보이는 겁니다. 

 

 



변수 규칙

URL에 적은  <variable_name>을 세션처럼 사용하여 URL에 가변 섹션을 추가할 수 있습니다. 파이썬 함수에서 <variable_name>을 키워드 인수로 받게 됩니다. 

 

선택적으로 컨버터를 사용하여 <converter:variable_name>과 같은 인수 유형을 지정할 수 있습니다.

컨버터 타입은 아래 표에 나와있습니다. 

 

string (기본값) 슬래시 없는 문자열이 가능합니다.
int 양의 정수만 가능합니다.
float 양의 실수만 가능합니다.
path 슬래시가 포함된 문자열이 가능합니다.
uuid UUID 문자열이 가능합니다.




variable_name.py로 저장합니다. 

 

from flask import Flask
from markupsafe import escape


app = Flask(__name__)

@app.route('/user/<username>')
def show_user_profile(username):
    # 전달받은 변수 username의 값을 출력합니다.
    return f'User {escape(username)}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # Post 옆에 URL에서 전달받은 정수를 출력합니다.
    return f'Post {post_id}'

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    # URL에서 /path/ 다음에 적은 경로를 출력합니다.
    return f'Subpath {escape(subpath)}'



다음처럼 실행합니다.

 

set FLASK_APP=variable_name

flask run



URL에 따라 다르게 웹페이지에 출력됩니다. 

 

 

 




Unique URLs / Redirection Behavior

 

다음 코드를 redirection.py로 저장합니다. 

두 개의 route 데코레이터는 각각  URL 뒤에 오는 슬래시(/)에 대한 동작이 다릅니다. 

 

from flask import Flask

app = Flask(__name__)

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'




다음 처럼 실행합니다.

 

set FLASK_APP=redirection

flask run



웹브라우저에서 접속해보면 http://127.0.0.1:5000/projects/ 과  http://127.0.0.1:5000/projects 는 는 동일하게 http://127.0.0.1:5000/projects/에 접속됩니다. 

 

즉, URL 마지막에 /가 있는지 유무와 상관없이 자동으로  http://127.0.0.1:5000/projects/ 로 리다이렉션됩니다. 

 



http://127.0.0.1:5000/about  의 경우에는 /가 추가된 URL http://127.0.0.1:5000/about/ 을 사용시에는 리다이렉션이 되지 않습니다. 

 




URL Building

url_for 함수를 사용하면 특정 파이썬 함수에 대한 URL을 출력해 볼 수 있습니다. 

url_for 함수의 첫번째 인수는 파이썬 함수의 이름이며 두번째 이후 인수로 키워드 인수를 추가할 수 있습니다. 



다음 코드를 url_building.py으로 저장합니다.  

 

from flask import Flask, url_for


app = Flask(__name__)



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

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

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

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'))




다음처럼 실행합니다.

 

set FLASK_APP=url_building

flask run




실행하면 터미널에 테스트 가능한 URL이 출력되는데  3번째는 알수 없네요.  

 

/

/login

/login?next=%2F

/user/John%20Doe




웹브라우저에서 3가지 경우만 테스트를 해보았습니다. 

 

 




HTTP Methods

 

기본적으로 route() 데코레이터는 GET 요청에만 응답합니다. route() 데코레이터의 methods 인수를 사용하여 POST 같은 다른  HTTP 메서드를 처리할 수 있습니다.



http_methods.py로 저장합니다. 

 

from flask import Flask, request

app = Flask(__name__)

def show_the_login_form():
    return 'get method'


def do_the_login():
    return 'post method'


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()



다음처럼 실행합니다.

 

set FLASK_APP=http_methods

flask run




웹브라우저에서 Get, Post 방식을 테스트해보았습니다. 




http://127.0.0.1:5000/login 을 사용하여 웹브라우저에서 접속하면 Get 방식이 됩니다. 

 



웹브라우저에서는 URL 접속으로 post 방식이 안되어 아래 링크를 참고하여 강제로 해보았습니다.

https://stackoverflow.com/questions/42107983/is-it-possible-to-do-a-post-request-from-browser-url 



javascript: 를 주소창에 입력한 후



아래 주소를 붙여넣기하면 Post 방식이 됩니다.

 

(function(){document.body.innerHTML='<form method="POST" action="http://127.0.0.1:5000/login"><input name="username" value="abc_user"/><input name="password" value="123456"/></form>';document.forms[0].submit()})();




문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts