[웹개발] 03. Flask 다시 배우기 - 기초
더 효과적으로 코딩하는 방법
1. 순환참조 오류를 예방하는 방법
- 기존에 사용하던 방법
# app.py 파일에서 직접 아래와 같이 사용
app = Flask(__name__)
위와 같이 Flask 객체를 전역으로 사용하면 프로젝트 규모가 커질수록 순환참조 오류가 발생할 확률이 높아진다.
- 해결 방법 (어플리케이션 팩토리를 사용)
# __init__.py 에서 create_app 메서드를 사용
def create_app():
app = Flask(__name__)
.....
return app
위와 같은 구조(애플리케이션 팩토리)를 사용하면 순환참조 문제를 해결할 수 있다.(이는 Flask 공식홈페이지에도 나와있는 내용이다.)
2. 블루프린트 사용하기
블루프린트를 사용하면 기능이나 용도별로 view나 package를 만들어 훨씬 구조적이고 효율적이게 설계할 수 있다. 또한, 기능별로 다른 파일에 분리할 수 있기때문에 유지, 보수가 간편하다.
# package_1/__init__.py
from flask import Blueprint
bp = Blueprint('package_1', __name__)
# __init__.py
def create_app():
app = Flask(__name__)
from package_1 import bp
app.register_blueprint(bp, url_prefix='/package_1')
# url_prefix에 의해 package_1에서 정의한 페이지는 {서브도메인:포트}/package_1/ 이후에 나오게 된다.
.....
return app
3. config.py 활용하여 설정하기
루트 디렉토리에 config.py를 추가하여 기타 설정을 분리하여 관리할 수 있다.
프로젝트의 규모가 작거나 설정할 요소들이 많지 않을때는 아래와같이 하나씩 직접 설정할 수 있다.
# __init__.py
def create_app():
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///XXXX'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'dkssudgktpdy'
app.config['JSON_AS_ASCII'] = False
.....
return app
하지만 설정값이 많아질 경우 관리하기 쉽지않고, 크고작은 에러를 발생할 위험이 있다. 따라서 이를 분리하여 config.py 를 만들어 설정값을 한번에 관리할 수 있다.
# config.py
SQLALCHEMY_DATABASE_URI = 'sqlite:///XXXX'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'dkssudgktpdy'
JSON_AS_ASCII = False
# __init__.py
import config
def create_app():
app = Flask(__name__)
app.config.from_object(config)
.....
return app