[Flask] Blueprint & Route

Alexandria·2023년 11월 3일
0

Python3 Flask

목록 보기
2/14
post-thumbnail

1. Blueprint

큰 규모의 애플리케이션을 개발하다 보면 코드의 길이가 길어져서 유지 보수 및 가독성이 안 좋아집니다.

이를 위해 작은 모듈로 분리하게 되며 라우팅 기능을 하는 코드들도 분리가 될 수 있습니다.

이때, 관련 경로들을 묶어서 모듈화할 수 있게 해줄 수 있는 기능입니다.

💡 본 글은 예제 코드를 이용하여 설명합니다.

1.1. 생성

flask/source/my_app/views/board.py를 살펴보면 board라는 이름을 가지는 블루프린트를 생성합니다.

url_prefix라는 인자를 통해 board 블루프린트를 사용하는 모든 경로는 /board/ 경로를 기반으로 설정됩니다.

# 코드 생략

bp_board = Blueprint(
    name="board",
    import_name=__name__,
    url_prefix="/board/"
)

같은 블루프린트를 사용하는 경우, 같은 함수 명을 사용할 수 없으며

다른 블루프린트를 사용하는 경우, 같은 함수 명을 사용할 수 있습니다.

1.2. 등록

블루프린트를 생성하였다고 해서 애플리케이션에 등록되지 않습니다.

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)
        
		# 코드 생략

2. Route

Flask 웹 애플리케이션에서 URL 경로와 뷰 함수를 연결하는 중요한 역할을 합니다.

이 데코레이터를 사용하여 특정 URL 경로에 대한 요청이 어떤 함수로 처리되어야 하는지를 정의할 수 있습니다.

2.1. Path

블루프린트는 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():
    # 코드 생략

2.2. Method

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():
    # 코드 생략

2.3. Variable

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):
    # 코드 생략
profile
IT 도서관

0개의 댓글