質問: 以下、web上で諸々調査してもってきたflaskでつくるときのディレクトリ構成の例になります。私がつくっているので10数本のAPIからなるシステムです。その場合、どの事例を真似てディレクトリ構成を検討すべきか悩んでいます。 より良いディレクトリ構成はどのようにすればよいか? もしくは、それぞれの良いところ、悪いところなど、諸々ご意見頂けると嬉しいです。また、各ファイルの命名の仕方が迷っていたりします。例えば、以下、アルゴリズムの処理コードが記載されたmodelとdbのモデルが記載されているmodelsは混合してしまうので命名を変更する必要があるのかなと思っています。 また、サンプル5にあるようにdbのモデルは、各テーブルごとにファイル分けして作る必要があるのかどうか迷っています(テーブル数は20もないぐらいです。) 私が作っているAPIのディレクトリ構成の現状 ``` . ├── Dockerfile ├── Makefile ├── README.md ├── __pycache__ │ └── conftest.cpython-36-PYTEST.pyc ├── app_production.yaml ├── app_staging.yaml ├── auth │ └── dev-f0996c06c4df.json ├── application_name │ ├── __init__.py -- エンドポイント │ ├── __pycache__ │ ├── auth │ ├── common │ ├── config │ ├── data │ ├── model -- 計算処理のアルゴリズム │ ├── models -- dbのモデル(models.pyの一つのファイルに書いている) │ ├── task │ └── url -- 各エンドポイント先の処理コード ├── conftest.py ├── cron.yaml ├── docker-compose.yaml ├── manage.py ├── requirements.txt ├── setup.cfg ├── setup.py ├── test.egg-info │ ├── PKG-INFO │ ├── SOURCES.txt │ ├── dependency_links.txt │ ├── not-zip-safe │ └── top_level.txt └── tests -- テストコード ├── __pycache__ ├── test_ac.py └── test_au.py ``` サンプル1(https://qiita.com/rarewin/items/8f252313db8ee7fa2de0) ``` config.py requirements.txt run.py instance/ config.py yourapp/ __init__.py views.py models.py forms.py static/ templates/ 各ファイル/ディレクトリについては、以下の表のような感じだそうです。 ファイル/ディレクトリ名 使い方 run.py 開発用サーバの実行用スクリプトでプロダクション用としては使わない requirements.txt 依存するパッケージを書く config.py 設定変数を格納したファイル /instance/config.py APIキーやデータベースのURIなど、バージョン管理に含めない設定変数を格納したファイル /yourapp/ アプリの格納用 /yourapp/__init__.py アプリの初期化用スクリプトで、様々なコンポーネントを読み込む /yourapp/view.py or /yourapp/views/ routeを定義するファイルもしくはディレクトリ /yourapp/models.py or /yourapp/models/ アプリのモデル(のクラス)を定義するファイルもしくはディレクトリ /yourapp/forms.py (or /yourapp/forms/ ? ) フォームの定義をするファイル(もしくはディレクトリ?) (なぜかこれだけ参考サイトの表からディレクトリが消えてました) /yourapp/static/ 公開用のCSS, JavaScript, 画像等のアプリで公開すべきファイル置き場 /yourapp/templates Jinja2テンプレートを置くんだ (なぜJinja2決めうちなんざましょ......) ``` サンプル2(https://stackoverflow.com/questions/30771387/flask-restful-project-structure) ``` /myproject README.md runserver.py /myproject __init__.py api.py /resources __init__.py foo.py bar.py /common __init__.py db.py /tests test_myproject.py ``` サンプル3(https://github.com/yoshiya0503/Hermetica/wiki/02-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90) ``` application/ |- server.py #サーバの起動スクリプト |- tasks.py # バッチのインターフェースやタスクランナーを記述 |- tools/ # バッチや、CLIツールをココに |- config/ # 設定ファイル |- __init__.py |- development.py |- production.py |- app/ |- __init__.py |- models/ |- views/ |- statics/ # 静的ファイル |- css/ |- js/ |- img/ |- templates/ |- migrations/ # flask-alembic を用いる場合の migration ファイル |- tests/ # noseテスト モデルとビューとモックデータ |- models/ |- views/ |- mocks/ |- venv/ # pyvenv 環境 gitignore しましょう |- lib/ |- bin/ |- include/ |- man/ (URL先の文章から抜粋) statics/ のディレクトリはクライアントサイドのフレームワークに合わせて修正するなどをするといいでしょう。 その際、 SPA であれば、 templates に一枚だけの HTML ページをレンダリングし、そこで使う js や css を宣言し、後はクライアントサイドのフレームワークで組んでいきましょう。 WEB-API だけを公開する場合、 views の部分で json だけを返す API として作成すると、ネイティブアプリ、 web アプリ両方に対応出来るようにするといいでしょう。 ``` サンプル4_blueprintを使った例(http://www.subarunari.com/entry/2017/10/11/003225) ``` /FlaskAppDirectory ├── app.py └── blueprints └── func1 ├── __init__.py ├── views.py └── templates └── func1 └── func1_a.html ``` サンプル5_dbのモデルの構成(https://github.com/yoshiya0503/Hermetica/wiki/03-Model) ``` application/ |- app/ |- __init__.py |- models/ |- __init__.py |- sa_user.py |- me_user.py |- session.py ```
回答: 参考になるかわかりませんが、私がFlaskで構築したブログサイトの構成です。 RESTfulAPIは分けて、apiのディレクトリに入れました。 また、modelsに各テーブル処理のファイルがあります。 「アルゴリズムの処理コードが記載されたmodel」は、`commons`や`modules`などの方が良いんじゃないでしょうか。 ページを返すところはHandler.pyとしましたが、View.pyの方がよいと思います。 ``` . ├── README.md ├── main.py #アプリ起動 ├── requirements.txt ├── api #RESTfulAPI │ └── ArticlesHandler.py ├── create_dynamodb.py ├── handlers #ページをかえす。 **View.pyの方がよいかも │ ├── ArticleHandler.py │ ├── ContentsHandler.py │ ├── IndexHandler.py │ ├── LoginHandler.py │ ├── __init__.py │ └── admin │ ├── AdminHandler.py │ └── __init__.py ├── lib #計算など │ ├── AccountManager.py │ ├── DataBeseManager.py │ ├── PermissionPolicies.py │ └── __init__.py ├── models #DBの操作 │ ├── ArticleModel.py │ ├── TagModel.py │ ├── UserModel.py │ └── __init__.py ├── static #静的ファイル │ ├── css │ ├── favicon.svg │ ├── icons │ ├── images │ └── js ├── templates #テンプレート、アンダーバーが部品 │ ├── article.html │ ├── contents.html │ ├── index.html │ ├── login.html │ ├── admin │ │ ├── _base.html │ │ ├── _menuebar.html │ │ ├── admin.html │ │ └── edit.html │ └── includes │ ├── _base.html │ ├── _footer.html │ ├── _navbar.html │ ├── _page_header.html │ ├── _sidebar.html │ ├── _top.html │ ├── robots.txt │ └── sitemap.xml └── zappa_settings.json ```