Flask 설정 다루기 — config 객체와 환경별 값
Flask 설정 다루기 — config 객체와 환경별 값
애플리케이션은 어떤 환경에서 도느냐에 따라 다르게 설정돼야 해요. 디버그 모드를 켜고 끈다든지, 시크릿 키를 바꾼다든지 하는 환경별 설정 말이죠. Flask는 이런 설정을 앱이 시작할 때 사용 가능한 config 객체에 담아 두는 방식으로 다뤄요.
Flask 설계상 보통 설정은 애플리케이션이 시작할 때 사용할 수 있어야 해요. 작은 앱은 설정을 코드에 직접 하드코딩해도 크게 나쁘지 않지만, 더 나은 방법이 있어요.
어떤 방식으로 설정을 로드하든, 로드된 설정 값을 담는 config 객체가 있어요. 바로 Flask 객체의 config 속성이에요. Flask 자신이 일부 설정 값을 여기에 두고, 확장(extension)들도 자기 설정을 여기에 넣어요. 물론 내가 원하는 설정도 이곳에 넣을 수 있어요.
설정의 기본
config는 실제로 딕셔너리의 하위 클래스라서 일반 딕셔너리처럼 수정할 수 있어요.
app = Flask(__name__)
app.config['TESTING'] = True
일부 설정 값은 Flask 객체로도 전달돼서, 거기서 읽고 쓸 수도 있어요.
app.testing = True
여러 키를 한 번에 업데이트하려면 dict.update() 메서드를 쓰면 돼요.
app.config.update(
TESTING=True,
SECRET_KEY='192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'
)
디버그 모드
DEBUG 설정 값은 특별해요. 앱이 셋업을 시작한 뒤에 바꾸면 일관되지 않게 동작할 수 있어요. 디버그 모드를 안정적으로 켜려면 flask 명령(또는 flask run)의 --debug 옵션을 쓰는 게 좋아요. 디버그 모드에서는 인터랙티브 디버거와 리로더가 기본으로 켜져요.
$ flask --app hello run --debug
옵션을 쓰는 걸 권장해요. DEBUG를 config나 코드에서 설정하는 것도 가능하지만 강력하게 권장하지 않아요. flask run 명령이 일찍 읽어내지 못하고, 일부 시스템이나 확장이 이전 값에 기반해 이미 자기 설정을 마쳤을 수 있기 때문이에요.
운영(production)에 배포할 때는 절대 디버그 모드를 켜면 안 돼요.
Flask 내장 설정 값들
Flask가 내부적으로 쓰는 몇 가지 설정 값을 짚어 볼게요.
- DEBUG — 디버그 모드 여부.
flask run으로 개발 서버를 띄우면 처리되지 않은 예외에 인터랙티브 디버거가 보이고, 코드가 바뀌면 서버가 리로드돼요.FLASK_DEBUG환경 변수로도 설정돼요. 기본값False. - TESTING — 테스트 모드 활성화. 예외가 앱의 에러 핸들러가 처리하기보다 전파(propagate)돼요. 확장도 테스트를 쉽게 하도록 동작을 바꿀 수 있어요. 기본값
False. - PROPAGATE_EXCEPTIONS — 예외가 앱의 에러 핸들러에 처리되지 않고 다시 던져져요. 설정하지 않으면
TESTING이나DEBUG가 켜져 있을 때 암묵적으로 참이 돼요. 기본값None. - TRAP_HTTP_EXCEPTIONS —
HTTPException타입 예외에 대한 핸들러가 없으면, 단순 에러 응답 대신 인터랙티브 디버거가 처리하도록 다시 던져요. 기본값False.
인스턴스 폴더와 설정 파일 로드
앱의 설정을 모듈에서 먼저 로드하고, 인스턴스 폴더의 파일이 있으면 덮어쓰는 패턴이 흔해요. 이를 위해 instance_relative_config=True를 써요.
app = Flask(__name__, instance_relative_config=True)
app.config.from_object('yourapplication.default_settings')
app.config.from_pyfile('application.cfg', silent=True)
인스턴스 폴더 경로는 Flask.instance_path로 알 수 있고, Flask.open_instance_resource()로 인스턴스 폴더의 파일을 여는 단축 방법도 있어요.
filename = os.path.join(app.instance_path, 'application.cfg')
with open(filename) as f:
config = f.read()
# 또는:
with app.open_instance_resource('application.cfg') as f:
config = f.read()
정리하면, Flask 설정은 환경별 값(디버그·시크릿 키 등)을 config 딕셔너리에 담아 다루고, from_object·from_pyfile로 모듈·파일에서 로드하며, 디버그 모드는 --debug 플래그로 켜는 것이 권장 패턴이에요.