Flask의 폴더 구성 요약

계속 Django를 사용하여, 웹 체계를 개발하는 인간.
틈새 시간으로 심플한 앱에서도 만들고 싶다고 생각하고 최근 Flask의 공부를 시작하고 있다.
하나의 파일에, 다양한 설정을 너무 많이 넣는 것은 역시 좋지 않기 때문에, MVC에 근거해, 디렉토리 구성을 정리했다.
flask_app
├ common
│ ├ libs
│ └ models  --- モデル
│   ├ user.py
│   └ ・・・
├ config --- 設定フォルダ
│ ├ base_setting.py --- 各環境共通設定
│ ├ local_setting.py --- ローカル開発環境用設定 
│ └ production_setting.py --- 本番環境用設定
├ controllers --- コントローラ
│ ├ index.py
│ └ ・・・
├ interceptors 
│ ├ auth.py --- 認証系処理
│ └ error_handler.py --- エラー処理
├ static --- 静的ファイル置き場所
├ templates --- テンプレート
│ ├ common
│ │ └ layout.html
│ └ index.html
├ application.py --- 複数のファイルが利用するものを定義(Flaskインスタンス、DB、環境変数など)
├ manager.py --- アプリ実行用スクリプト(アプリの入り口)
├ requirements.py --- ライブラリ一覧
└ www.py --- ルーティング

실행 흐름


  • application.py에서 application 및 db 초기화 및 설정 읽기
    (Django처럼 명령 (python manager.py runserver)으로 앱을 시작하고 싶기 때문에 flash_script의 Manager를 사용합니다.)
  • Manager를 씹은 application을 www.py에서 읽고 라우팅
  • db를 models로 읽어 모델 정의
  • manager.py에서 루딩 된 application을 실행합니다.

    파일 역할 설명



    순서대로 쫓아 설명해 간다.app.config.from_pyfile("config/base_setting.py") 에서 공통 설정을 먼저 읽는다. 환경에 따라 (개발 · 프로덕션) 바뀌는 설정은 사전에 설정한 환경 변수 ops_config의 다른 값에 따라 다른 설정 파일을 읽도록 했다.

    flask_app/application.py
    from flask import Flask
    from flask_script import Manager
    from flask_sqlalchemy import SQLAlchemy
    import os
    app = Flask(__name__)
    
    manager = Manager(app)
    app.config.from_pyfile("config/base_setting.py")
    
    # linux export ops_config=local|production
    # windows set ops_config=local|production
    if "ops_config" in os.environ:
        app.config.from_pyfile("config/%s_setting.py" % (os.environ['ops_config']))
    
    db = SQLAlchemy(app)
    
    

    controllers 내용은 기능 단위로 나누고 www.py에 blueprint를 사용하여 통합한다.

    flask_app/www.py
    from interceptors.errorHandler import *
    from interceptors.Auth import *
    from application import app
    from controllers.index import index_page
    
    from flask_debugtoolbar import DebugToolbarExtension
    toolbar = DebugToolbarExtension(app)
    
    
    app.register_blueprint(index_page, url_prefix="/")
    
    

    모델 안에 모델을 정의. 여기에서는 user.py에 테스트용 모델을 정의했다.

    flask_app/common/models/user.py
    from application import db
    
    
    class User(db.Model):
        __tablename__ = 'user'
    
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(20), nullable=False)
    
    

    controllers 안에 실제 처리를 정의.

    flask_app/controllers/index.py
    from flask import Blueprint, render_template
    from common.models.user import User
    
    index_page = Blueprint("index_page", __name__)
    
    
    @index_page.route("/")
    def index():
        name = "hello"
        context = {"name": name}
        context["user"] = {"nickname": "xxxx",
                           "id": "xxxxx", "home_page": "http://www.xxx"}
        context["num_list"] = [1, 2, 3, 4, 5]
    
        result = User.query.all()
        context['result'] = result
    
        return render_template("index.html", **context)
    
    

    Manager의 add_commend 메소드에서 runserver 명령과 create_all 명령을 등록하십시오.

    flask_app/manager.py
     from application import app, db, manager
    from flask_script import Server, Command
    from www import *
    
    # web server
    manager.add_command("runserver", Server(host = "0.0.0.0", use_debugger=True, use_reloader=True))
    
    # create tables
    @Command
    def create_all():
        from common.models.user import User  
        db.create_all()
    
    manager.add_command("create_all", create_all)
    
    def main():
        manager.run()
    
    if __name__ == "__main__":
        # app.run( host = "0.0.0.0" )
    
        try:
            import sys
            sys.exit( main() )
        except Exception as e:
            import traceback
            traceback.print_exc()
    
    

    실행


  • pip install -r requirements.py 에서 필요한 모듈 설치.
  • flask_app/local_setting.py 에서 자신의 환경에 맞게 db의 user, password, host, port를 설정.
  • 자신의 환경에 이름이 flask인 DB를 작성.
  • 프로젝트 폴더(flask_app) 아래에 python manager.py create_all를 두드린다.
    이름이 user인 마스터가 생성된다.
  • python manager.py runserverhttp://localhost:5000 방문하여 다음 화면이 나오면 성공!


  • 출처



    소스를 gitHub에 올렸으므로 시간이 있으면 다운로드 하고 놀아보세요.

    다음에 할 일


  • Flask를 사용하여 간단한 CRUD 앱 만들기
  • Vue.js와의 연계를 생각한다
  • 좋은 웹페이지 즐겨찾기