큰 규모의 애플리케이션을 개발하다 보면 코드의 길이가 길어져서 유지 보수 및 가독성이 안 좋아집니다.
이를 위해 작은 모듈로 분리하게 되며 라우팅 기능을 하는 코드들도 분리가 될 수 있습니다.
이때, 관련 경로들을 묶어서 모듈화
할 수 있게 해줄 수 있는 기능입니다.
💡 본 글은 예제 코드를 이용하여 설명합니다.
flask/source/my_app/views/board.py를 살펴보면 board라는 이름을 가지는 블루프린트
를 생성합니다.
url_prefix
라는 인자를 통해 board 블루프린트를 사용하는 모든 경로는 /board/ 경로를 기반으로 설정됩니다.
# 코드 생략
bp_board = Blueprint(
name="board",
import_name=__name__,
url_prefix="/board/"
)
같은 블루프린트를 사용하는 경우, 같은 함수 명을 사용할 수 없으며
다른 블루프린트를 사용하는 경우, 같은 함수 명을 사용할 수 있습니다.
블루프린트를 생성하였다고 해서 애플리케이션에 등록되지 않습니다.
flask/source/my_app/__init__.py의 create_app 함수를 살펴보면 Flask()를 통해 생성된 객체에서 register_blueprint
함수를 이용하여 생성한 블루프린트를 등록해주었습니다.
# 코드 생략
def create_app():
app.config.from_object(obj=config["development"])
with app.app_context():
from my_app.views.index import bp_index
from my_app.views.board import bp_board
from my_app.views.comment import bp_comment
from my_app.views.dashboard import bp_dashboard
from my_app.views.cache import bp_cache
from my_app.api.v1 import bp_api
app.register_blueprint(blueprint=bp_index)
app.register_blueprint(blueprint=bp_board)
app.register_blueprint(blueprint=bp_comment)
app.register_blueprint(blueprint=bp_dashboard)
app.register_blueprint(blueprint=bp_cache)
app.register_blueprint(blueprint=bp_api)
# 코드 생략
Flask 웹 애플리케이션에서 URL 경로와 뷰 함수를 연결하는 중요한 역할을 합니다.
이 데코레이터를 사용하여 특정 URL 경로에 대한 요청이 어떤 함수로 처리되어야 하는지를 정의할 수 있습니다.
블루프린트는 route()
를 통해 URL 경로에 대해서 처리할 함수를 정의할 수 있습니다.
기본적으로 첫 번째 인자로 경로를 전달하여 구분할 수 있으며, rule이라는 인자 명으로 지정할 수도 있습니다.
flask/source/my_app/views/board.py를 살펴보면 각각 http://host/board/ 와 http://host/board/write/에 대한 요청을 처리하게 됩니다.
@bp_board.route(rule="/", methods=["GET", "POST"])
@login_required
def main():
# 코드 생략
@bp_board.route(rule="/write", methods=["GET", "POST"])
@login_required
def write():
# 코드 생략
methods
매개변수를 사용하여 허용할 HTTP 요청 메서드를 지정할 수 있습니다.
기본적으로 GET 메서드가 허용되며, 여러개의 다양한 메서드를 지정할 수도 있습니다.
flask/source/my_app/views/index.py를 살펴보면 GET과 POST를 이용한 요청을 허용하고 request.method
를 이용하여 처리를 합니다.
반면, GET 메서드만 허용하고 있으면 POST로 접근 시 405 Method Not Allowed가 반환됩니다.
@bp_index.route(rule="/", methods=["GET", "POST"])
def login():
# 코드 생략
@bp_index.route(rule="/regist", methods=["GET", "POST"])
def regist():
# 코드 생략
@bp_index.route(rule="/logout", methods=["GET"])
@login_required
def logout():
# 코드 생략
URL 경로에서 특정 위치의 값을 변수로 하여 데이터를 처리할 수 있으며, 변수의 타입에 따라 처리할 함수를 지정할 수 있습니다.
flask/source/my_app/views/board.py의 119번을 살펴보면 int형으로 post_id 값을 받고 있습니다.
http://host/board/3과 같은 요청에 대해서는 처리하지만, http://host/board/a와 같은 string형 요청은 처리하지 않게 됩니다.
@bp_board.route(rule="/<int:post_id>", methods=["GET"])
@login_required
def view(post_id:int):
# 코드 생략