質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.04%

flaskで開発するRESTfulAPIのディレクトリ構成をどう決めていくか?

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,875

以下、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
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

参考になるかわかりませんが、私がFlaskで構築したブログサイトの構成です。
RESTfulAPIは分けて、apiのディレクトリに入れました。

また、modelsに各テーブル処理のファイルがあります。
「アルゴリズムの処理コードが記載されたmodel」は、commonsmodulesなどの方が良いんじゃないでしょうか。

ページを返すところは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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる