2012-02-22 3 views
71

私は最初のFlaskアプリケーションを構築しています。私は、アプリケーションを整理するための良い、きれいなPythonの方法を理解できません。 例のようにすべてのものを単一の.pyファイルに収めたくないのですが。 アプリの各部分を別々のモジュールにまとめたいと思います。 物を整理するにはどうすればよいでしょうか?比較的大きなFlaskアプリケーションをどのように編成するのですか?

+3

ここで説明されているレイアウトはかなり好きです:http://flask.pocoo.org/docs/patterns/packages/ – obmarg

+1

ここでは、私が避けたい円形のインポートを使用しています。 – daniels

+0

trueですが、app.routeデコレータを使いたい場合は避けられないと思います。 – obmarg

答えて

78

私は「Fbone」と呼ばれるフラスコ定型プロジェクトを作成して、それをチェックアウトして自由とフォーク気軽にどうぞ:)

Fbone(フラスコの骨)をフラスコ(Pythonのマイクロフレーム)テンプレート/ストラップ/定型アプリケーションです。まあ青写真を使用して大きなプロジェクトのために設計され

概要

  • 最新のフロントエンドフレームワークと統合:jQuery/html5boilerplate/bootstrap
  • 有名なSQLalchemyの支援を受けています。
  • フラスコログインによってトリッキーな "私を覚えてください"を実装します。
  • フラスコ重量のハンドルフォーム。
  • フラスコ試験および鼻による単位試験。
  • ファブリックとmod_wsgi(例を含む)を使用して簡単にデプロイします。フラスコ・バベルによって
  • 国際化が

ところで、私はちょうど便利フラスコを持つ大規模なプロジェクトを構築する上で、このwikiを見つけ、plsはそれをチェック!

+1

すごい定型会、いい仕事! –

+0

本当にこれが好きです。ありがとうございました! – jdsantiagojr

+0

READMEに詳述されているように 'fab d'を実行する前に、 'source env/bin/activate'で仮想環境をアクティブにする必要があります – JRG

20

フラスコ0.7は、Blueprintsを実装しています。それらは、メインアプリケーションオブジェクトをインポートせずにrouteデコレータを使用するのに最適です。

+1

青写真とモジュールとの違いは? – dcolish

+1

技術的には、青写真はBlueprintクラスのインスタンスです。 1つまたは複数のモジュールにまたがることができます。また、同じモジュールで複数の設計図が共存することもあります。場面の裏には、テンプレートと静的フォルダを見つけるための青写真のモジュールやパッケージを理解する魔法がいくつかあります。 –

+1

私のフラスコ骨プロジェクトに青写真を統合しました。私の答えplsを見てください。 – imwilsonxu

12

私の(私の基準で)大きなFlaskプロジェクト(5000行のPythonコードで、半分しか完成していません)に取り組んでいます。顧客は、プロジェクトはモジュラーになりたいので、私はこのapporachを取っ:

マイフォルダ構造は次のようになります。modules.yml

├── __init__.py 
├── modules.yml 
├── config 
├── controllers 
│ └── ... 
├── lib: Common functions I use often 
│ └── ... 
├── models 
│ └── ... 
├── static: All static files 
│ ├── css 
│ ├── img 
│ └── js 
└── templates: Jinja2 templates 
    └── ... 

私は名前やURLなど、私のモジュールを定義します。この方法で、顧客は単一のPythonファイルに触れることなくモジュールを有効/無効にすることができます。さらに、モジュールリストに基づいてメニューを生成します。慣例として、すべてのモジュールにはという独自のPythonモジュールがあり、modelmodels/からロードします。すべてのコントローラはコントローラの名前としてBlueprintを格納しています。例えば。 userモジュールのために、私はcontrollers/user.pyを持っている:

# Module name is 'user', thus save Blueprint as 'user' variable 
user = Blueprint('user', __name__) 

@user.route('/user/') 
def index(): 
    pass 

この道を、私は私の__init__.pyと負荷にmodules.ymlを読み込み、動的にすべて対応モジュールを登録することができます

# Import modules 
for module in modules: 

    # Get module name from 'url' setting, exculde leading slash 
    modname = module['url'][1:] 

    try: 
     # from project.controllers.<modname> import <modname> 
     mod = __import__(
      'project.controllers.' + modname, None, None, modname 
     ) 
    except Exception as e: 
     # Log exceptions here 
     # [...] 

    mod = getattr(mod, modname) # Get blueprint from module 
    app.register_blueprint(mod, url_prefix=module['url']) 

私は願って、これをすることができあなたのためのいくつかのインスピレーション:

+0

どこにテストファイルを置いていますか? – Alp

+1

上記の構造は実際にはプロジェクト名( 'project_name /')を持つサブディレクトリです。 'tests /'フォルダと 'scripts /'フォルダ(実行可能スクリプト用)もあります。'tests /'の場合は、モデルテストの場合は 'tests/models /'、コントローラテストの場合は 'tests/controllers /'と同じ構造を使用するのが賢明でしょう。それは構造を維持するためのオーバーヘッドを必要としますが、必要なファイルを見つけるのは非常に簡単です。 – msiemens

15

マット・ライトのwonderful postを必ず読んでください。

ポスト機能:

  1. 大きなフラスコプロジェクト

  2. An example application on Github

  3. 一般的には最高のデザインの実践の記述のための構造の説明、それが大になりますMVCパターン、Appファクトリ、サービス、データマイグレーションのようなWebアプリケーション(ほとんどの興味深い機能IMHO)があります。

2

私は最初からフラスコアプリyapperを作成し、フロントエンドとバックエンドの開発の両方のための一口でそれを統合しています。 これは簡単なブログエンジンですが、要件に応じて開発するために簡単に変更できます。それは青写真を使ってうまく構成されています。

チェックアウトプロジェクトページyapper

2

私はフラスコの上に構築されたソーシャルネットワーク上で働いていました。私のプロジェクトに関する特別なことは、サーバーが純粋にAPIエンドポイントを提供しており、フロントエンドが1ページのバックボーンアプリだということでした。私が撮ったフラスコ構造は以下の通りです:

├── app │ ├── api
│ │ ├── auth.py │ │ └── ... │ ├── app.py │ ├── common │ │ ├── constants.py │ │ ├── helpers.py │ │ ├── response.py │ │ └── ... │ ├── config.py │ ├── extensions.py │ ├── frontend │ │ └── controllers.py │ ├── static │ │ └── ... │ ├── templates │ │ ├── app.html │ │ └── ... │ └── users │ ├── UserConstants.py │ ├── UserForms.py │ ├── UserHelpers.py │ ├── UserModels.py │ └── __init__.py ├── alembic | ├── version │ └── ... ├── tests │ └── ...

あなたは、私が話題hereに書いた、より詳細な記事を読むことができます。私はそれがはるかに直感的な独自のフォルダに別の機能領域を分離することがわかった。

私はしばらく前にコードに取り組み、オープンソース化しました。あなたはそれを確認することができますon github

+0

ありがとうございます。いい感じ。 – daniels

関連する問題