파이썬을 이용해 웹 어플리케이션을 만들 수 있도록 돕는 Flask에 대해 정리해보겠습니다.
flask_app
└── __init__.py
from flask import Flask
app = Flask(__name__)
@app.route('/', methods=['POST', 'GET'])
def home():
return 'Hello World!'
__init__
은 해당 파일이 포함되어 있는 디렉토리를 하나의 모듈로 만듭니다. __init__
이 포함되어 있는 flask_app 파일을 실행하면 __init__
이 실행되는 구조입니다.app = Flask(__name__)
: 어플리케이션의 이름을 지정합니다. 이 어플리케이션의 이름은 __init__
입니다. @app.route('/')
: 어플리케이션의 루트 주소입니다. URL에 따라 실행하게 될 함수를 지정합니다. localhost:5000에 엔드포인트인 /
가 붙으면 home()
함수가 실행됩니다.home()
: 해당 함수에 붙은 앤드포인트로 들어가면 'Hello World!'가 리턴됩니다.methods=['POST', 'GET']
: POST와 GET HTTP Request 메소드를 허용합니다. 그 외의 메소드는 해당 앤드포인트에서 허용되지 않습니다.#FLASK_APP={환경변수} flask run
FLASK_APP=flask_app flask run
flask_app
이라는 이름의 flask 어플리케이션을 실행합니다. flask 파일명이 __init__
이므로, 해당 파일의 상위 디렉을 환경변수로 설정합니다.from flask import Flask
def create_app():
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello World!'
return app
create_app
이라는 함수 안에 어플리케이션의 기능을 차곡차곡 쌓는 방식을 어플리케이션 팩토리라고 합니다. 기능이 많아질 수록 라우트도 많아집니다. 이때 라우트를 하나의 파일에 모아서 사용하지 않고 기능별로 나눠서 관리하면 각 기능을 구조적으로 관리할 수 있습니다.
flask_app
├── __init__.py
└── views
└── main_views.py
# user_routes.py
from flask import Blueprint
bp = Blueprint('main', __name__, url_prefix='/')
@bp.route('/')
def main():
return 'home page'
@bp.route('/main')
def main():
return 'main page'
main_views.py
: main에 해당하는 기능을 views 폴더의 main_views.py에 관리하겠습니다.from flask import Blueprint
: Blueprint 모듈을 import합니다.main
: 해당 블루프린트의 명칭입니다.__name__
: 외부에서 해당 블루프린트를 import할 때 사용할 이름입니다. 파일명(main_views)을 사용한다는 의미입니다.url_prefix='/
: 해당 블루프린트에 접근하는 앤드포인트를 설정합니다. bp
를 사용하는 라우트는 /
을 사용해서 접근할 수 있습니다.이렇게 기능별로 분리한 폴더에서 파일을 따로 만들어준 뒤 팩토리에 해당 블루프린트를 import 합니다.
# __init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
from .views import main_views
app.register_blueprint(main_views.bp)
return app
from .views import main_views
: 현재 위치(.
)에 있는 views 폴더에서 main_views
파일을 import합니다.app.register_blueprint(main_views.bp)
: import한 main_views
파일을 블루프린트로 등록합니다.이렇게 블루프린트로 등록한 후에 flask run을 하게 되면 main_views의 기능을 사용할 수 있게 됩니다.
URL로 어플리케이션에 세부 작업을 요청하는 방법을 알아보겠습니다.
@app.route('/id/', defaults={ 'id' : 0 })
@app.route('/id/<id>')
def query_id(id):
return f"Your Id is {id}"
@app.route('/id/<id>')
: URL에 localhost:5000/id/ggpark을 입력하면 ggpark이 query_id
의 인자로 넘어갑니다. 화면에서는 Your Id is ggpark이라는 결과가 출력됩니다.@app.route('/id/', defaults={ 'id' : 0 }
: 사용자로부터 아무런 값을 전달받지 못했을 때 해당 페이지에서는 '0'을 디폴트로 사용자에게 화면을 출력합니다.이처럼 사용자가 입력/요청하는 값에 따라 특정한 결과를 return하도록 라우트를 설정할 수 있습니다.