문제점: app.py에서 라우트를 불러오고, auth.py에서 @app.route를 쓰기 위해 app을 불러오면 상호 import로 인한 순환 참조 에러가 발생합니다.
해결책: auth.py는 app 대신 독립적인 auth_bp (Blueprint 객체)를 사용하고, app.py에서 이를 가져와 등록만 함으로써 참조 방향을 단방향으로 만듭니다.
from routes.auth import auth_bp는 무슨 뜻인가요?
routes 폴더 내 auth.py 파일에서 auth_bp 변수를 가져오겠다는 의미입니다.
init_app(app) 함수 파라미터로 app을 써도 되나요?
가능합니다. import 시점에 app을 불러오는 것이 아니라, app.py에서 생성 완료된 app 객체를 함수 인자로 전달받아 실행하는 시점에는 이미 app이 준비되어 있으므로 순환 참조가 발생하지 않습니다.
from flask import Blueprint, render_template
# app을 import하지 않고 독립적인 Blueprint 객체 생성
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login')
def login():
return render_template('login.html')
② 패키지 초기화 파일 (routes/init.py)
from .main import main_bp
from .auth import auth_bp
# app을 전달받아 블루프린트를 일괄 등록하는 함수
def init_app(app):
app.register_blueprint(main_bp)
app.register_blueprint(auth_bp, url_prefix='/auth')
③ 메인 실행 파일 (app.py)
from flask import Flask
import routes
app = Flask(__name__)
# 생성된 app 객체를 init_app 함수에 전달
routes.init_app(app)
if __name__ == '__main__':
app.run(debug=True)