ぼくのかんがえるさいきょうのFlaskアプリのディレクトリ構成 - 7月 06, 2018 こんにちは、ぐぐりら(@guglilac)です。 最初同じファイルにdbの設定、アプリの作成、モデル定義、ルーテイング、コントローラなどを詰め込んで書いてみて一応動いたから、次は機能ごとに分割してみることにした。 公式のディレクトリ構成を真似してこれにたどり着いた。 ``` - main -static(css,JS) -templates(html) -__init__.py(application,dbの初期化) -models.py(モデル) -views.py(ルーティング、コントローラ) -config.py(設定ファイル) -manage.py(アプリ実行用スクリプト) -requirements.txt(ライブラリ一覧) -instance(非公開設定ファイル置き場) ``` 内部の仕組みは次の通り。 1. mainの__init__.pyでapplicationとdbの初期化と設定の読み込み 1. このapplicationをviewsの__init__.pyで読んでルーティング 1. dbをmodelsで読み込んでモデル定義 1. ルーティングしたapplicationをmanage.pyで実行 この順にサンプルを載せていく。 まずapplicationとdbの初期化、設定の読み込み。 Flaskの設定については以下の記事も参考にしてみてください。 僕の考えるFlaskの設定まわりのベストプラクティス `config.py`に`Develop`クラスなど環境ごとに設定を定義する。 DBとの接続設定などをここに書く。 FlaskのDB連携については以下の記事を書いてます。 FlaskのDB連携(sqlite, SQLAlchemy)のやり方 ```python:main/__init__py from flask import Flask from flask_sqlalchemy import SQLAlchemy import os config = { "development": "config.Development", "production": "config.Production" } def configure_app(app): # 環境変数を利用して読み込む設定ファイルを決定 config_name = os.getenv('FLASK_CONFIGURATION', 'production') # 設定はオブジェクトとして読み込む app.config.from_object(config[config_name]) # センシティブな設定はインスタンスフォルダ内の設定で上書きする app.config.from_pyfile('config.cfg', silent=False) application = Flask(__name__, instance_relative_config=True) configure_app(application) db = SQLAlchemy(application) ``` viewsの中身は機能単位で分割し、blueprintを使って統合する。 以下は、`views/user.py`と`views/item.py`の中で作ったblueprintである`app`を読み込んで`application`に登録している。 blueprintについてはこの記事に書いたので参考にしてみてください。 Flaskのviewをblueprintで分割する ```python:views/__init__.py from main.views import user, item from main import application modules_define = [user.app, item.app] for app in modules_define: application.register_blueprint(app) ``` dbを読み込んでモデル定義。 1対多のモデルの作り方は以下の記事をみてみて。 Flaskで1対多のモデルを定義する方法 ```python:models.py from main import db class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), default='', nullable=False) email = db.Column(db.String(100), unique=True, nullable=False) def __init__(self, username, email): self.username = username self.email = email ``` 実行。 ```python:manage.py from main.views import application application.run() ``` ぜひぜひ参考にしてみてください! この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿