[웹개발] 03. Flask 다시 배우기 - 기초

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

© 2020. All rights reserved.