컴퓨터 공학

👉 [Flask] Blueprint 활용하기 (라우팅 함수 관리)

bitcodic 2021. 6. 28. 11:31

플라스크는 정말 micro한 장점이 있다고 생각한다. 타 프레임워크에 비하면 구조나 세팅에 있어서 매우 자유롭다

즉 그만큼, 자동으로 해주는게 적다는 뜻이기도 하다(=내가 고생을 해야한다)

 

아무튼 Flask를 활용하다 보면 한 파일에 많은 양의 라우팅 함수가 모이는 경우를 볼 수 있다.

 

@app.route('/users/')
def show_users(page):
    users = User.query.all()
    return render_template('users.html', users=users)
    
    
@app.route('/')
def main():
	return render_template('main.html')
    
    
@app.route('/report')
def report():
	return render_template('report.html')

이런식으로, 지금 개발하고 있는 서버 코드가 라우팅 함수만 1000줄을 넘어간다. 이렇게 되면 한번에 볼 수 있다는 점은 좋으나,

 

1. 협업에 문제가 생긴다

 = 깃을 통해 협업을 하는데, 특정 한 파일에 작업이 몰려있으면 병합시에 conflict가 날 경우가 많이 발생한다.

2. 한 파일에 소스가 방대해진다.

 = 다들 알다시피 다방면의 문제의 소지가 커진다.

 

당연히 초반부터 라우팅함수를 나눠가며 써야했겠지만, 미루고 미루다 보니 여기까지 왔다. 이제와서 나누자니 테스트를 전체 다 돌려야 한다는게 문제가.. 크지만.. 아무튼 해야한다.

 

 

이러한 문제를 해결하는 것이 Flask 의 Blueprint 이다. 0.7 버전부터 도입됬다고 한다.

 

# main.py
from flask import Blueprint, render_template

bp = Blueprint('main', __name__, url_prefix='/')

@bp.route("/")
def main():
    return "Main"

@bp.route("/privacy")
def privacy():
    return render_template("privacy.html")

해당 파일에는 Blueprint 인스턴스인 bp가 데코레이터를 통해 라우팅 처리를 한다. 기존 Flask 객체로 라우팅 처리하는 것과 유사하다.

이때 Blueprint의 name의 경우 유니크해야 하며, url_prefix는 말 그대로 url 앞에 프리픽스 처리를 할 값을 넣는다.

예를 들어 url_prefix='/user' 인 경우, 해당 블루프린트 라우팅 함수들에 대해서는 @bp.route("/privacy") 가 실제로 동작시에는 '/use/privacy' 라는 값으로 변경된다.

 

# app.py
import main

app = Flask(__name__,  static_url_path='/static')

app.register_blueprint(main.bp)

이렇게 생성된 블루프린트 인스턴스는 import하여 Flask 객체의 register_blueprint 함수를 활용해 적용시킨다.

 

이런 형태로 한 파일에 모여있던 라우팅 함수들을 여러 파일로 쪼개 사용할 수 있고, 위에서 제기한 문제점들을 해결할 수 있다.