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()})();
'WEB > Flask' 카테고리의 다른 글
Flask 강좌 6 - 리다이렉트와 에러(Redirects and Errors) (0) | 2021.12.24 |
---|---|
Flask 강좌 5 - request 예제(로그인, 파일 업로드, 쿠키) (0) | 2021.12.22 |
Flask 강좌 4 - 렌더링 템플릿 (0) | 2021.12.20 |
Flask 강좌 2 - HTML Escaping (0) | 2021.12.19 |
Flask 강좌 1 - 최소한의 애플리케이션 (0) | 2021.10.09 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!